dp+有源汇上下界的最小流;
dp:按pair

#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=(n);i++)
#define rep2(i,k,n) for(int i=k;i>=(n);i--)
using namespace std;
const int N=50305;
const int M=600005;
const int inf=0x3f3f3f3f;
struct node{int x,y,id;node(int x=0,int y=0,int id=0):x(x),y(y),id(id){}
}a[N];
bool cmp(node A,node B){return A.y==B.y ? A.x<B.x : A.y<B.y;
}
int n;
map<int,int> mp1,mp2,mp3;
int f[N],fa[N],from[N],mx[N],pos,tag[N],stk[N],top,f2[N],ans,in[N],out[N];
int S,T,SS,TT,cur[N],Sum=0;
void dp1(){memset(f,-0x7f,sizeof(f));memset(mx,-0x7f,sizeof(f));f[0]=0;int t=0;for(int i=0;i<=n;i=++t){while(t<n && a[t+1].y==a[t].y)t++;rep(j,i,t){if(mp1.find(a[j].x+a[j].y)!=mp1.end()){int p=mp1[a[j].x+a[j].y];if(f[p]+1>f[j])f[j]=f[p]+1,fa[j]=p;}mp1[a[j].x+a[j].y]=j;if(mp2.find(a[j].x-a[j].y)!=mp2.end()){int p=mp2[a[j].x-a[j].y];if(f[p]+1>f[j])f[j]=f[p]+1,fa[j]=p;}mp2[a[j].x-a[j].y]=j;if(mp3.find(a[j].x)!=mp3.end()){int p=mp3[a[j].x];if(f[p]+1>f[j])f[j]=f[p]+1,fa[j]=p;}mp3[a[j].x]=j;}int now=-1;rep(j,i+1,t){if(now==-1||f[j-1]>f[now])now=j-1;if(f[now]+j-i>mx[j])mx[j]=f[now]+j-i,from[j]=now;}now=-1;rep2(j,t-1,i){if(now==-1||f[j+1]>f[now])now=j+1;if(f[now]+t-j>mx[j])mx[j]=f[now]+t-j,from[j]=now;}rep(j,i,t)if(mx[j]>f[j])f[j]=mx[j],tag[j]=1;    }pos=0;rep(i,1,n)if(!pos||f[i]>f[pos])pos=i;
}
void dp2(){mp1.clear(),mp2.clear(),mp3.clear();memset(f2,-0x7f,sizeof(f2));memset(mx,-0x7f,sizeof(f));rep(i,1,n)if(f[i]==ans)f2[i]=1;int t=n;for(int i=n;i>=0;i=--t){while(t && a[t-1].y==a[t].y)t--;rep2(j,i,t){if(mp1.find(a[j].x+a[j].y)!=mp1.end()){int p=mp1[a[j].x+a[j].y];if(f2[p]+1>f2[j])f2[j]=f2[p]+1;}mp1[a[j].x+a[j].y]=j;if(mp2.find(a[j].x-a[j].y)!=mp2.end()){int p=mp2[a[j].x-a[j].y];if(f2[p]+1>f2[j])f2[j]=f2[p]+1; }mp2[a[j].x-a[j].y]=j;if(mp3.find(a[j].x)!=mp3.end()){int p=mp3[a[j].x];if(f2[p]+1>f2[j])f2[j]=f2[p]+1;}mp3[a[j].x]=j;}int now=-1;rep(j,t+1,i){if(now==-1||f2[j-1]+i-j+1>f2[now]+i-now)now=j-1;if(f2[now]+i-now>mx[j])mx[j]=f2[now]+i-now;}now=-1;rep2(j,i-1,t){if(now==-1||f2[j+1]+j+1-t>f2[now]+now-t)now=j+1;if(f2[now]+now-t>mx[j])mx[j]=f2[now]+now-t;}rep(j,t,i)if(mx[j]>f2[j])f2[j]=mx[j];   }
}
void print(int x,int y){if(x<y){int lx=x;while(lx>=0 && a[lx].y==a[y].y)printf("%d ",a[lx].id),lx--;int rx=x+1;while(rx<=y && a[rx].y==a[y].y)printf("%d ",a[rx].id),rx++;}else{int rx=x;while(rx<=n && a[rx].y==a[y].y)printf("%d ",a[rx].id),rx++;int lx=x-1;while(lx>=y && a[lx].y==a[y].y)printf("%d ",a[lx].id),lx--;}
}
void solve(){printf("%d\n",ans=f[pos]);top=0;int now=pos;while(now!=-1){if(now)stk[++top]=now;if(tag[now]){stk[++top]=from[now];now=fa[from[now]];}else now=fa[now];}while(top){if(a[stk[top]].y==a[stk[top-1]].y)print(stk[top],stk[top-1]),top--;else printf("%d ",a[stk[top]].id);top--;}printf("\n");
}
struct E{int to,next,cap;E(int to=0,int next=0,int cap=0):to(to),next(next),cap(cap){}
}edge[M];
int head[N],tot=1;
void add(int x,int y,int cap){edge[++tot]=E(y,head[x],cap);head[x]=tot;edge[++tot]=E(x,head[y],0);head[y]=tot;
}
void build(){mp1.clear(),mp2.clear(),mp3.clear();S=n+1,T=S+1,SS=T+1,TT=SS+1;rep(i,0,n){if(mp1.find(a[i].x+a[i].y)!=mp1.end()){int p=mp1[a[i].x+a[i].y];if(f[p]+f2[i]==ans){add(p,i,inf);out[p]++;in[i]++;}}mp1[a[i].x+a[i].y]=i;if(mp2.find(a[i].x-a[i].y)!=mp2.end()){int p=mp2[a[i].x-a[i].y];if(f[p]+f2[i]==ans){add(p,i,inf);out[p]++;in[i]++;}}mp2[a[i].x-a[i].y]=i;if(mp3.find(a[i].x)!=mp3.end()){int p=mp3[a[i].x];if(f[p]+f2[i]==ans){add(p,i,inf);out[p]++;in[i]++;}}mp3[a[i].x]=i;}rep(i,0,n){add(S,i,inf),add(i,T,inf);if(in[i]>out[i]){add(SS,i,in[i]-out[i]);Sum+=in[i]-out[i];}else{add(i,TT,out[i]-in[i]);Sum+=out[i]-in[i];}}
}
queue<int> Q;
int d[N];
bool bfs(){memset(d,0x7f,sizeof(d));memcpy(cur,head,sizeof(head));Q.push(SS);d[SS]=0;while(!Q.empty()){int u=Q.front();Q.pop();for(int i=head[u];i;i=edge[i].next)if(edge[i].cap){int v=edge[i].to;if(d[v]>d[u]+1){d[v]=d[u]+1;Q.push(v);}}}return d[TT]<inf;
}
int dfs(int u,int a){if(u==TT || !a)return a;int flow=0,f;for(int &i=cur[u];i;i=edge[i].next)if(edge[i].cap){int v=edge[i].to;if(d[v]==d[u]+1 && (f=dfs(v,min(a,edge[i].cap)))>0){edge[i].cap-=f;edge[i^1].cap+=f;flow+=f;a-=f;if(!a)return flow;}}return flow;
}
void dinic(){while(bfs()){dfs(SS,inf);}
}
int main(){
//  freopen("in.in","r",stdin);
//  freopen("out.out","w",stdout);scanf("%d",&n);int x,y;rep(i,1,n){scanf("%d%d",&x,&y);a[i]=node(x,y,i);}sort(a+1,a+n+1,cmp);memset(fa,-1,sizeof(fa));if(n==1){printf("0\n\n0\n");return 0;}dp1();solve();dp2();build();dinic();add(T,S,inf);dinic();printf("%d\n",edge[tot].cap);
} 

【NOI2015】小园丁与老司机相关推荐

  1. P2304 [NOI2015] 小园丁与老司机(网络流/上下界网络流)

    P2304 [NOI2015] 小园丁与老司机 平面上有n个点,每次可以向左.右.上.左上45度.右上45度移动,然后直线移动到达第一个没有到过的点,如果没有这样的点就不能移动,求解一条最长路,然后求 ...

  2. BZOJ4200 洛谷2304 UOJ132:[NOI2015]小园丁与老司机——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4200 https://www.luogu.org/problemnew/show/P2304 ht ...

  3. 提高千倍效率的35个编码小技巧,老司机带你飞!

    点击关注公众号,实用技术文章及时了解 来源:henleylee.github.io/posts/2019/a780fcc1.html 前言 代码优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的 ...

  4. mysql入门到跑路_Mysql入门二十小题(DBA老司机带你删库到跑路)2018.11.26

    1. 请介绍数据库管理系统的种类及代表产品 RDBMS: mysql oracle mssql NoSQL: redis  mongoab  memcache 2. 请简述数据库管理系统的作用 数据存 ...

  5. oracle从删库到跑路,Mysql入门二十小题(DBA老司机带你删库到跑路)2018.11.26

    1. 请介绍数据库管理系统的种类及代表产品 RDBMS: mysql oracle mssql NoSQL: redis  mongoab  memcache 2. 请简述数据库管理系统的作用 数据存 ...

  6. 年薪30W的软件测试“老司机”工作经验

    这几天,新入职的小MM提议"老司机"们把自己这些年的软件测试工作经验跟大家分享一下,让新同学学习学习,利用空闲时间我整理了一些,可能不全,勉强看看,这也算是对自己这些年的工作总结. ...

  7. 【新梦想学员干货】必看!年薪30W的软件测试“老司机”工作经验。

    这几天,新入职的小MM提议"老司机"们把自己这些年的软件测试工作经验跟大家分享一下,让新同学学习学习,利用空闲时间我整理了一些,可能不全,勉强看看,这也算是对自己这些年的工作总结. ...

  8. 名悦集团:开车从不追尾,老司机分享驾驶避免事故小知识

    听交通广播,我们几乎每天都能听到高速路上,高架桥上,上班路上发生追尾事故,有时候是个平常的上下班高峰期.很多人会纳闷,车开的好好的,怎么就会发生追尾事故呢.开车在路上,难免会有磕磕碰碰.道路千万条,安 ...

  9. 老司机都在用的浏览器,体积小功能齐全,直呼内行

    现在市面上的浏览器简直是多不胜数,虽然数量多,但是好用的并不多.尤其是某些大厂的浏览器,无用的功能越来越多,越来越臃肿,体积也越来越大,使用体验还不好,有时候甚至不如一些小众浏览器.今天给大家安利2款 ...

  10. 视频教程-老司机讲前端之微信小程序开发成语消消乐游戏视频课程-微信开发

    老司机讲前端之微信小程序开发成语消消乐游戏视频课程 中国实战派HTML5培训第一人,微软技术讲师,曾任百合网技术总监,博看文思HTML5总监.陶国荣长期致力于HTML5.JavaScript.CSS3 ...

最新文章

  1. Exchange 分析器工具介绍及案例分析
  2. 【Flutter】侧拉导航栏实现 ( Drawer 组件 | PageView 组件 )
  3. adb 连接某个wifi_一加7 Pro全局强制开启90Hz刷新率的办法(附ADB文件下载)
  4. sqlmap自动扫描注入点_同天上降魔主,真是人间太岁神——SQLMAP 高级教程
  5. AESNI/XData勒索病毒来袭 目前主要在乌克兰传播 它居然还能使用硬件加速加密过程...
  6. 记事本linux命令换行符,Windows 10版记事本应用终于支持Linux/Mac换行符 排版不再辣眼睛...
  7. 非洲做生意进货渠道_WikiFundi如何帮助非洲人民为维基百科做贡献
  8. startActivity流程(上)
  9. 都是宝宝:北京孩子3成不玩电子游戏睡眠状况最好 江苏孩子起得最早
  10. jQuery学习(十二)—jQuery中对象的查找方法总结
  11. 2014计算机二级办公软件高级应用技术,计算机二级办公软件高级应用技术跟ms office一级考试的内容是不是一样的...
  12. 接入百度智能云文字识别OCR记录
  13. 本地nodejs+gulp完成字体转换 ttf转成woff2格式
  14. 东大计算机硕士奖学金,【信息学院硕士研究生第二学年普通奖学金评定方案】...
  15. Belief propagation
  16. JAVA初学习(三)(数组和面向对象)
  17. Mysql - 带条件求和(sum)
  18. phpstudy mysql建表_MySQL_总结MySQL建表、查询优化的一些实用小技巧,MySQL建表阶段是非常重要的一 - phpStudy...
  19. mysql 存储过程中 if else的使用 和赋值方式
  20. 嵌套循环中的break和continue使用规则

热门文章

  1. 欧美文学与信仰传统书摘
  2. Xilinx FPGA的DNA是什么?
  3. CSS——网易云音乐之登录页面的实现
  4. nginx代理安装ssl证书
  5. 为什么现在的程序员那么卑微?青出于蓝而胜于蓝啊
  6. html 灯箱效果,基于 BootStrap 4 的图片灯箱效果 | 智慧宫
  7. CTU CU CB PU TU
  8. 【电脑使用】桌面图标有蓝底怎么去掉
  9. IBM FlashSystem掌控现代存储,靠的是硬实力
  10. vue-meta实现router动态设置meta标签