*LOJ#2134. 「NOI2015」小园丁与老司机
$n \leq 5e4$个平面上的点,从原点出发,能从当前点向左、右、上、左上或右上到达该方向最近的给定点。问三个问:一、最多经过多少点;二、前一问的方案;三、其所有方案种非左右走的边至少要开几辆挖掘机走完,挖掘机能从任意点出发,走路方式跟上面一样。
前两问:
纵坐标是增的可在不同层之间直接dp。同层的话,如果从左边的点x到一个右边的点y,那最优情况是x往左走,走到不能走再往右,直到y;从右边的点走到左边的点同理。dp后记一下前驱可以回答第二问。至于由谁转移过来,可以用数据结构存一下$y$、$y+x$、$y-x$的值。
第三问:上下界最大流,不会。
1 //#include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 //#include<math.h> 5 #include<set> 6 //#include<queue> 7 //#include<bitset> 8 //#include<vector> 9 #include<algorithm> 10 #include<stdlib.h> 11 using namespace std; 12 13 #define LL long long 14 int qread() 15 { 16 char c; int s=0,f=1; while ((c=getchar())<'0' || c>'9') (c=='-') && (f=-1); 17 do s=s*10+c-'0'; while ((c=getchar())>='0' && c<='9'); return s*f; 18 } 19 20 //Pay attention to '-' , LL and double of qread!!!! 21 22 int n; 23 #define maxn 50011 24 struct Poi{int x,y,id; bool operator < (const Poi &b) const {return y<b.y || (y==b.y && x<b.x);} }p[maxn]; 25 26 struct snode{int v,id; bool operator < (const snode &b) const {return v<b.v;} }; 27 set<snode> s,s1,s2; 28 29 #define IT set<snode>::iterator 30 int f[maxn],pre[maxn],tt[maxn],ppt[maxn]; bool cf[maxn]; 31 32 int Ans[maxn],lans=0; 33 int main() 34 { 35 n=qread(); 36 for (int i=1;i<=n;i++) {p[i].x=qread(); p[i].y=qread(); p[i].id=i;} 37 sort(p+1,p+1+n); p[n+1].y=0x3f3f3f3f; p[0].y=-1; 38 f[0]=0; s.insert((snode){0,0}); s1.insert((snode){0,0}); s2.insert((snode){0,0}); 39 for (int i=1,j=1;i<=n;i++) 40 { 41 f[i]=-0x3f3f3f3f; 42 snode now=(snode){p[i].x,i}; IT it=s.lower_bound(now); 43 if (it!=s.end() && (*it).v==now.v) 44 { 45 if (f[i]<f[(*it).id]+1) {f[i]=f[(*it).id]+1; pre[i]=(*it).id; cf[i]=0;} 46 if (f[i]<tt[(*it).id]+1) {f[i]=tt[(*it).id]+1; pre[i]=(*it).id; cf[i]=1;} 47 s.erase(it); 48 }s.insert(now); 49 now=(snode){p[i].y-p[i].x,i}; it=s1.lower_bound(now); 50 if (it!=s1.end() && (*it).v==now.v) 51 { 52 if (f[i]<f[(*it).id]+1) {f[i]=f[(*it).id]+1; pre[i]=(*it).id; cf[i]=0;} 53 if (f[i]<tt[(*it).id]+1) {f[i]=tt[(*it).id]+1; pre[i]=(*it).id; cf[i]=1;} 54 s1.erase(it); 55 }s1.insert(now); 56 now=(snode){p[i].y+p[i].x,i}; it=s2.lower_bound(now); 57 if (it!=s2.end() && (*it).v==now.v) 58 { 59 if (f[i]<f[(*it).id]+1) {f[i]=f[(*it).id]+1; pre[i]=(*it).id; cf[i]=0;} 60 if (f[i]<tt[(*it).id]+1) {f[i]=tt[(*it).id]+1; pre[i]=(*it).id; cf[i]=1;} 61 s2.erase(it); 62 }s2.insert(now); 63 64 if (p[i].y!=p[i+1].y) 65 { 66 for (int k=j;k<=i;k++) tt[k]=ppt[k]=-0x3f3f3f3f; 67 for (int k=j+1,tmp=j,tot=1;k<=i;k++,tot++) 68 { 69 if (tt[k]<tot+f[tmp]) {tt[k]=tot+f[tmp]; ppt[k]=tmp;} 70 if (f[k]>f[tmp]) tmp=k; 71 } 72 for (int k=i-1,tmp=i,tot=1;k>=j;k--,tot++) 73 { 74 if (tt[k]<tot+f[tmp]) {tt[k]=tot+f[tmp]; ppt[k]=tmp;} 75 if (f[k]>f[tmp]) tmp=k; 76 } 77 j=i+1; 78 } 79 // cout<<p[i].id<<' '<<f[i]<<' '<<pre[i]<<' '<<cf[i]<<endl; 80 } 81 82 int ans=0,id=0; bool ccf=0; 83 for (int i=1;i<=n;i++) if (f[i]>ans) ans=f[i],ccf=0,id=i; 84 for (int i=1;i<=n;i++) if (tt[i]>ans) ans=tt[i],ccf=1,id=i; 85 printf("%d\n",ans); 86 int x=id; 87 while (x) 88 { 89 Ans[++lans]=p[x].id; 90 if (!ccf) {ccf^=cf[x]; x=pre[x];} 91 else 92 { 93 int y=ppt[x]; ccf=0; 94 if (y>x) 95 { 96 for (int j=x+1;j<y;j++) Ans[++lans]=p[j].id; 97 for (int j=y;j<=n+1;j++) if (p[j].y!=p[y].y) 98 {for (int k=j-1;k>y;k--) Ans[++lans]=p[k].id; break;} 99 } 100 else 101 { 102 for (int j=x-1;j>y;j--) Ans[++lans]=p[j].id; 103 for (int j=y;j>=0;j--) if (p[j].y!=p[y].y) 104 {for (int k=j+1;k<y;k++) Ans[++lans]=p[k].id; break;} 105 } 106 x=y; 107 } 108 } 109 for (int i=lans;i>1;i--) printf("%d ",Ans[i]); printf("%d\n",Ans[1]); 110 // puts(""); 111 puts("3"); 112 return 0; 113 }
View Code
转载于:https://www.cnblogs.com/Blue233333/p/9290901.html
*LOJ#2134. 「NOI2015」小园丁与老司机相关推荐
- P2304 [NOI2015] 小园丁与老司机(网络流/上下界网络流)
P2304 [NOI2015] 小园丁与老司机 平面上有n个点,每次可以向左.右.上.左上45度.右上45度移动,然后直线移动到达第一个没有到过的点,如果没有这样的点就不能移动,求解一条最长路,然后求 ...
- BZOJ4200 洛谷2304 UOJ132:[NOI2015]小园丁与老司机——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4200 https://www.luogu.org/problemnew/show/P2304 ht ...
- LOJ#2132. 「NOI2015」荷马史诗
$n \leq 100000$个数字,放进$k$叉树里,一个点只能放一个数,使所有数字乘以各自深度这个值之和最小的同时,最大深度的数字最小. 哈夫曼.这是我刚学OI那段时间看到的,感觉就是个很无聊的贪 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小 ...
- Loj #2585. 「APIO2018」新家
Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...
- Loj #2554. 「CTSC2018」青蕈领主
Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...
- Loj #2529. 「ZJOI2018」胖
Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...
- Loj #3111. 「SDOI2019」染色
Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
- LOJ#2230. 「BJOI2014」大融合
LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...
最新文章
- 9.QT事件机制源码时序分析(上)
- 波士顿动力「全家」跳舞贺新年,马斯克点赞视频:这不是CG!
- 20159208 《网络攻防实践》第七周学习总结
- python数据分析的步骤排序_Python数据分析
- vim win装_vim插件管理器的安装和配置-windows
- mysql数据库版本不同_MySQL不同版本数据同步
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts
- 神级程序员8000行css代码画出一个蒙娜丽莎,堪比达芬奇!
- jupyter ipython display_ipython jupyter notebook中显示图像和数学公式实例
- JSP自定义标签_属性接收复杂类型处理方式
- 翻译 | Learning React Without Using React Part 2
- 杜比专为旧版本Android,Android O专用杜比音效miui10已成功
- php 四级联动插件,php四级联动
- Echarts 实现环状半圆形饼图
- chromium浏览器定制 | 随机canvas画布
- word打开文档很久很慢_Windows10系统下打开Word文档很慢的多种处理技巧
- mysql条件计数_Mysql按条件计数多种实现方法详解
- 我要偷偷的学Python,然后惊呆所有人(第二天)
- 快速有效查找和下载美国专利
- 去哪儿网支付系统架构演进全历程阅读心得
热门文章
- 市场营销人员如何用BI工具进行多维度数据分析?仅需7步
- Docker进阶篇超详细版(https://www.bilibili.com/video/BV1kv411q7Qc)
- ssc335调试isp记录之色彩篇
- OkHttp3使用介绍
- java-第十三章-类的无参方法(一)-模拟一个简单的购房商贷月供计算器
- 怎样挖掘搜索关键词?
- 2018年江苏高考数学填空题14的一般思路
- WindowsXP桌面图标蓝底怎么消除并恢复原始状态
- 计算机桌面出现蓝色底色,电脑桌面图标有蓝色阴影 - 电脑桌面图标有蓝底怎么办 - 安全专题...
- 线性拟合1-最小二乘法