$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」小园丁与老司机相关推荐

  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. LOJ#2132. 「NOI2015」荷马史诗

    $n \leq 100000$个数字,放进$k$叉树里,一个点只能放一个数,使所有数字乘以各自深度这个值之和最小的同时,最大深度的数字最小. 哈夫曼.这是我刚学OI那段时间看到的,感觉就是个很无聊的贪 ...

  4. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小 ...

  5. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

  6. Loj #2554. 「CTSC2018」青蕈领主

    Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...

  7. Loj #2529. 「ZJOI2018」胖

    Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...

  8. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  9. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  10. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

最新文章

  1. 9.QT事件机制源码时序分析(上)
  2. 波士顿动力「全家」跳舞贺新年,马斯克点赞视频:这不是CG!
  3. 20159208 《网络攻防实践》第七周学习总结
  4. python数据分析的步骤排序_Python数据分析
  5. vim win装_vim插件管理器的安装和配置-windows
  6. mysql数据库版本不同_MySQL不同版本数据同步
  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts
  8. 神级程序员8000行css代码画出一个蒙娜丽莎,堪比达芬奇!
  9. jupyter ipython display_ipython jupyter notebook中显示图像和数学公式实例
  10. JSP自定义标签_属性接收复杂类型处理方式
  11. 翻译 | Learning React Without Using React Part 2
  12. 杜比专为旧版本Android,Android O专用杜比音效miui10已成功
  13. php 四级联动插件,php四级联动
  14. Echarts 实现环状半圆形饼图
  15. chromium浏览器定制 | 随机canvas画布
  16. word打开文档很久很慢_Windows10系统下打开Word文档很慢的多种处理技巧
  17. mysql条件计数_Mysql按条件计数多种实现方法详解
  18. 我要偷偷的学Python,然后惊呆所有人(第二天)
  19. 快速有效查找和下载美国专利
  20. 去哪儿网支付系统架构演进全历程阅读心得

热门文章

  1. 市场营销人员如何用BI工具进行多维度数据分析?仅需7步
  2. Docker进阶篇超详细版(https://www.bilibili.com/video/BV1kv411q7Qc)
  3. ssc335调试isp记录之色彩篇
  4. OkHttp3使用介绍
  5. java-第十三章-类的无参方法(一)-模拟一个简单的购房商贷月供计算器
  6. 怎样挖掘搜索关键词?
  7. 2018年江苏高考数学填空题14的一般思路
  8. WindowsXP桌面图标蓝底怎么消除并恢复原始状态
  9. 计算机桌面出现蓝色底色,电脑桌面图标有蓝色阴影 - 电脑桌面图标有蓝底怎么办 - 安全专题...
  10. 线性拟合1-最小二乘法