传送门

这该死的码农题……

题解在这儿->这里

  1 //minamoto
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<queue>
  7 #define inf 0x3f3f3f3f
  8 using namespace std;
  9 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 10 char buf[1<<21],*p1=buf,*p2=buf;
 11 inline int read(){
 12     #define num ch-'0'
 13     char ch;bool flag=0;int res;
 14     while(!isdigit(ch=getc()))
 15     (ch=='-')&&(flag=true);
 16     for(res=num;isdigit(ch=getc());res=res*10+num);
 17     (flag)&&(res=-res);
 18     #undef num
 19     return res;
 20 }
 21 const int N=100005;
 22 int n,jsx,jsy,js1,js2;
 23 struct node{int x,y,b1,b2,id;}p[N];
 24 int bx[N],by[N],bb1[N],bb2[N];
 25 int up[N],lup[N],rup[N],f[N],Tx[N],Tb1[N],Tb2[N],bj[N],tx[N],ty[N],gup[N],bup[N];
 26 bool cmpy(node a,node b){return a.y>b.y;}
 27 bool cmpx(node a,node b){return a.x<b.x;}
 28 vector<int> iny[N];
 29 void prework(){
 30     sort(bx+1,bx+1+n),sort(by+1,by+1+n);
 31     sort(bb1+1,bb1+1+n),sort(bb2+1,bb2+1+n);
 32     jsx=unique(bx+1,bx+1+n)-bx-1;
 33     jsy=unique(by+1,by+1+n)-by-1;
 34     js1=unique(bb1+1,bb1+1+n)-bb1-1;
 35     js2=unique(bb2+1,bb2+1+n)-bb2-1;
 36     for(int i=1;i<=n;++i){
 37         p[i].x=lower_bound(bx+1,bx+1+jsx,p[i].x)-bx,tx[i]=p[i].x;
 38         p[i].y=lower_bound(by+1,by+1+jsy,p[i].y)-by,ty[i]=p[i].y;
 39         p[i].b1=lower_bound(bb1+1,bb1+1+js1,p[i].b1)-bb1;
 40         p[i].b2=lower_bound(bb2+1,bb2+1+js2,p[i].b2)-bb2;
 41     }
 42     sort(p+1,p+1+n,cmpy);
 43     for(int i=1;i<=n;++i){
 44         int k=p[i].id;
 45         up[k]=Tx[p[i].x],lup[k]=Tb1[p[i].b1],rup[k]=Tb2[p[i].b2];
 46         Tx[p[i].x]=Tb1[p[i].b1]=Tb2[p[i].b2]=k;
 47     }
 48     sort(p+1,p+1+n,cmpx);
 49     for(int i=1;i<=n;++i)
 50     iny[p[i].y].push_back(p[i].id);
 51 }
 52 void print(int num){
 53     int y=ty[num],sz=iny[y].size(),nxt=bj[num];
 54     if(num!=n) printf("%d ",num);
 55     if(tx[nxt]<tx[num]){
 56         for(int i=0;i<sz;++i)
 57         if(tx[iny[y][i]]>tx[num]) printf("%d ",iny[y][i]);
 58         for(int i=sz-1;~i;--i)
 59         if(tx[iny[y][i]]<tx[num]&&tx[iny[y][i]]>=tx[nxt]) printf("%d ",iny[y][i]);
 60     }
 61     else if(tx[nxt]>tx[num]){
 62         for(int i=sz-1;~i;--i)
 63         if(tx[iny[y][i]]<tx[num]) printf("%d ",iny[y][i]);
 64         for(int i=0;i<sz;++i)
 65         if(tx[iny[y][i]]>tx[num]&&tx[iny[y][i]]<=tx[nxt]) printf("%d ",iny[y][i]);
 66     }
 67     if(bup[nxt]) print(bup[nxt]);
 68 }
 69 void work1(){
 70     prework();
 71     for(int y=jsy;y;--y){
 72         int kmx=0,kbj=0,sz=iny[y].size();
 73         for(int i=0;i<sz;++i){
 74             int k=iny[y][i];
 75             if(up[k]&&f[up[k]]>gup[k]) gup[k]=f[up[k]],bup[k]=up[k];
 76             if(lup[k]&&f[lup[k]]>gup[k]) gup[k]=f[lup[k]],bup[k]=lup[k];
 77             if(rup[k]&&f[rup[k]]>gup[k]) gup[k]=f[rup[k]],bup[k]=rup[k];
 78             f[k]=kmx,bj[k]=kbj;
 79             if(sz-i+gup[k]>kmx) kmx=sz-i+gup[k],kbj=k;
 80         }
 81         kmx=kbj=0;
 82         for(int i=sz-1;~i;--i){
 83             int k=iny[y][i];
 84             if(kmx>f[k]) f[k]=kmx,bj[k]=kbj;
 85             if(gup[k]+1>f[k]) f[k]=gup[k]+1,bj[k]=k;
 86             if(i+1+gup[k]>kmx) kmx=i+1+gup[k],kbj=k;
 87         }
 88     }
 89     printf("%d\n",f[n]-1),print(n),puts("");
 90 }
 91 int S,T,s,t,ans,tot=1;
 92 int ok[N],du[N],cur[N],head[N],Next[N*10],ver[N*10],edge[N*10],dep[N];
 93 queue<int> q;
 94 inline void adde(int u,int v,int e){
 95     ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
 96     ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=0;
 97 }
 98 inline void add(int u,int v){
 99     for(int i=head[u];i;i=Next[i]) if(ver[i]==v) return;
100     ok[v]=1,++du[v],--du[u],adde(u,v,inf);
101 }
102 void calc(int y,int i){
103     int sz=iny[y].size(),num=iny[y][i];
104     for(int j=0;j<i;++j){
105         int k=iny[y][j];
106         if(up[k]&&f[up[k]]+sz-j==f[num]) add(k,up[k]);
107         if(lup[k]&&f[lup[k]]+sz-j==f[num]) add(k,lup[k]);
108         if(rup[k]&&f[rup[k]]+sz-j==f[num]) add(k,rup[k]);
109     }
110     for(int j=i+1;j<sz;++j){
111         int k=iny[y][j];
112         if(up[k]&&f[up[k]]+j+1==f[num]) add(k,up[k]);
113         if(lup[k]&&f[lup[k]]+j+1==f[num]) add(k,lup[k]);
114         if(rup[k]&&f[rup[k]]+j+1==f[num]) add(k,rup[k]);
115     }
116     if(up[num]&&f[up[num]]+1==f[num]) add(num,up[num]);
117     if(lup[num]&&f[lup[num]]+1==f[num]) add(num,lup[num]);
118     if(rup[num]&&f[rup[num]]+1==f[num]) add(num,rup[num]);
119 }
120 void build(){
121     ok[n]=1;
122     for(int y=1;y<=jsy;++y){
123         int sz=iny[y].size();
124         for(int i=0;i<sz;++i) if(ok[iny[y][i]]) calc(y,i);
125     }
126 }
127 bool bfs(){
128     while(!q.empty()) q.pop();
129     for(int i=1;i<=n+4;++i) cur[i]=head[i],dep[i]=-1;
130     q.push(S),dep[S]=0;
131     while(!q.empty()){
132         int u=q.front();q.pop();
133         for(int i=head[u];i;i=Next[i]){
134             int v=ver[i];
135             if(dep[v]<0&&edge[i]){
136                 dep[v]=dep[u]+1,q.push(v);
137                 if(v==T) return true;
138             }
139         }
140     }
141     return false;
142 }
143 int dfs(int u,int limit){
144     if(u==T||!limit) return limit;
145     int flow=0,f;
146     for(int i=cur[u];i;cur[u]=i=Next[i]){
147         int v=ver[i];
148         if(dep[v]==dep[u]+1&&(f=dfs(v,min(limit,edge[i])))){
149             flow+=f,limit-=f;
150             edge[i]-=f,edge[i^1]+=f;
151             if(!limit) break;
152         }
153     }
154     if(!flow) dep[u]=-1;
155     return flow;
156 }
157 void work2(){
158     build();
159     s=n+1,t=n+2,S=n+3,T=n+4;
160     for(int i=1;i<=n;++i)
161     du[i]>0?ans+=du[i],adde(S,i,du[i]):adde(i,T,-du[i]);
162     while(bfs()) ans-=dfs(S,inf);
163     printf("%d\n",ans);
164 }
165 int main(){
166     //freopen("testdata.in","r",stdin);
167     n=read();
168     for(int i=1;i<=n;++i){
169         bx[i]=p[i].x=read(),by[i]=p[i].y=read();
170         bb1[i]=p[i].b1=p[i].y-p[i].x,bb2[i]=p[i].b2=p[i].x+p[i].y;
171         p[i].id=i;
172     }
173     ++n,p[n].id=n;
174     work1(),work2();
175     return 0;
176 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9586023.html

bzoj4200: [Noi2015]小园丁与老司机(可行流+dp)相关推荐

  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. 皮一皮:论出门带物的重要性...
  2. 用imageMagick的composite合并图片
  3. LsLoader——通用移动端Web App离线化方案
  4. 使用rancher-2.5.5部署单节点kubernetes集群
  5. js获取日期实例之昨天今天和明天、后天
  6. SharePoint 2010 Crawl Component Stuck in “Recovering” status
  7. Java的Interrupt与线程中断
  8. JavaScript Date时间对象
  9. Cesium视频教程
  10. java基本数据类型的数值范围
  11. N81新手入门全攻略——N81常规设置问答篇
  12. python计算活了多少天计算器_年龄计算器-实际岁数计算器-周岁计算器-虚岁计算器-生日天数计算-活了多少天计算-虚岁怎么算...
  13. ue4打包h5_ue4学习之嵌入H5网页(web Brower)
  14. Oracle之创建定时任务
  15. Python简陋版工资管理系统
  16. electron获取媒体流(实现屏幕分享)
  17. SRPG游戏开发(五十六)第十一章 地图动作与地图事件 - 五 移动、攻击与待机(Move, Attack and Holding)
  18. 机关事业单位工资管理业务分析
  19. 数据结构PTA 案例6-1.6 哈利·波特的考试
  20. Adobe Premiere

热门文章

  1. sqlite3 dbconfig说明
  2. mkv转换mp4格式,mkv格式转mp4
  3. 电商商品爬虫,亚马逊amazon采集源码
  4. c语言中char* 代表什么
  5. 雷视一体机助力智慧高速路侧感知建设
  6. 2016阿里巴巴校园招聘内推篇
  7. bzoj4199品酒大会
  8. U8常用的二次开发方式
  9. 上海数学高考 计算机,编程已进入高考?别被广告文洗脑,编程并未纳入上海高考科目!...
  10. android模拟键盘自动输入,Android测试教程5--模拟键盘输入