*LOJ#2134. 「NOI2015」小园丁与老司机
$n \leq 5e4$个平面上的点,从原点出发,能从当前点向左、右、上、左上或右上到达该方向最近的给定点。问三个问:一、最多经过多少点;二、前一问的方案;三、其所有方案种非左右走的边至少要开几辆挖掘机走完,挖掘机能从任意点出发,走路方式跟上面一样。
前两问:
纵坐标是增的可在不同层之间直接dp。同层的话,如果从左边的点x到一个右边的点y,那最优情况是x往左走,走到不能走再往右,直到y;从右边的点走到左边的点同理。dp后记一下前驱可以回答第二问。至于由谁转移过来,可以用数据结构存一下$y$、$y+x$、$y-x$的值。
第三问:上下界最大流,不会。
//#include<iostream>
#include<cstring>
#include<cstdio>
//#include<math.h>
#include<set>
//#include<queue>
//#include<bitset>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int n;
#define maxn 50011
struct Poi{int x,y,id; bool operator < (const Poi &b) const {return y<b.y || (y==b.y && x<b.x);} }p[maxn]; struct snode{int v,id; bool operator < (const snode &b) const {return v<b.v;} };
set<snode> s,s1,s2; #define IT set<snode>::iterator
int f[maxn],pre[maxn],tt[maxn],ppt[maxn]; bool cf[maxn]; int Ans[maxn],lans=;
int main()
{
n=qread();
for (int i=;i<=n;i++) {p[i].x=qread(); p[i].y=qread(); p[i].id=i;}
sort(p+,p++n); p[n+].y=0x3f3f3f3f; p[].y=-;
f[]=; s.insert((snode){,}); s1.insert((snode){,}); s2.insert((snode){,});
for (int i=,j=;i<=n;i++)
{
f[i]=-0x3f3f3f3f;
snode now=(snode){p[i].x,i}; IT it=s.lower_bound(now);
if (it!=s.end() && (*it).v==now.v)
{
if (f[i]<f[(*it).id]+) {f[i]=f[(*it).id]+; pre[i]=(*it).id; cf[i]=;}
if (f[i]<tt[(*it).id]+) {f[i]=tt[(*it).id]+; pre[i]=(*it).id; cf[i]=;}
s.erase(it);
}s.insert(now);
now=(snode){p[i].y-p[i].x,i}; it=s1.lower_bound(now);
if (it!=s1.end() && (*it).v==now.v)
{
if (f[i]<f[(*it).id]+) {f[i]=f[(*it).id]+; pre[i]=(*it).id; cf[i]=;}
if (f[i]<tt[(*it).id]+) {f[i]=tt[(*it).id]+; pre[i]=(*it).id; cf[i]=;}
s1.erase(it);
}s1.insert(now);
now=(snode){p[i].y+p[i].x,i}; it=s2.lower_bound(now);
if (it!=s2.end() && (*it).v==now.v)
{
if (f[i]<f[(*it).id]+) {f[i]=f[(*it).id]+; pre[i]=(*it).id; cf[i]=;}
if (f[i]<tt[(*it).id]+) {f[i]=tt[(*it).id]+; pre[i]=(*it).id; cf[i]=;}
s2.erase(it);
}s2.insert(now); if (p[i].y!=p[i+].y)
{
for (int k=j;k<=i;k++) tt[k]=ppt[k]=-0x3f3f3f3f;
for (int k=j+,tmp=j,tot=;k<=i;k++,tot++)
{
if (tt[k]<tot+f[tmp]) {tt[k]=tot+f[tmp]; ppt[k]=tmp;}
if (f[k]>f[tmp]) tmp=k;
}
for (int k=i-,tmp=i,tot=;k>=j;k--,tot++)
{
if (tt[k]<tot+f[tmp]) {tt[k]=tot+f[tmp]; ppt[k]=tmp;}
if (f[k]>f[tmp]) tmp=k;
}
j=i+;
}
// cout<<p[i].id<<' '<<f[i]<<' '<<pre[i]<<' '<<cf[i]<<endl;
} int ans=,id=; bool ccf=;
for (int i=;i<=n;i++) if (f[i]>ans) ans=f[i],ccf=,id=i;
for (int i=;i<=n;i++) if (tt[i]>ans) ans=tt[i],ccf=,id=i;
printf("%d\n",ans);
int x=id;
while (x)
{
Ans[++lans]=p[x].id;
if (!ccf) {ccf^=cf[x]; x=pre[x];}
else
{
int y=ppt[x]; ccf=;
if (y>x)
{
for (int j=x+;j<y;j++) Ans[++lans]=p[j].id;
for (int j=y;j<=n+;j++) if (p[j].y!=p[y].y)
{for (int k=j-;k>y;k--) Ans[++lans]=p[k].id; break;}
}
else
{
for (int j=x-;j>y;j--) Ans[++lans]=p[j].id;
for (int j=y;j>=;j--) if (p[j].y!=p[y].y)
{for (int k=j+;k<y;k++) Ans[++lans]=p[k].id; break;}
}
x=y;
}
}
for (int i=lans;i>;i--) printf("%d ",Ans[i]); printf("%d\n",Ans[]);
// puts("");
puts("");
return ;
}
*LOJ#2134. 「NOI2015」小园丁与老司机的更多相关文章
- 「NOI2015」小园丁与老司机
「NOI2015」小园丁与老司机 要不是这道码农题,去年就补完了NOI2015,其实两问都比较simple,但是写起来很恶心. 先解决第一问,记 \(dp[i]\) 表示老司机到达第 \(i\) 棵树 ...
- 【BZOJ4200】【NOI2015】小园丁与老司机(动态规划,网络流)
[BZOJ4200][NOI2015]小园丁与老司机(动态规划,网络流) 题面 BZOJ权限题,洛谷链接 题解 一道二合一的题目 考虑第一问. 先考虑如何计算六个方向上的第一个点. 左右上很好考虑,只 ...
- UOJ132 【NOI2015】小园丁与老司机
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- loj#2009.「SCOI2015」小凸玩密室
题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...
- loj#2129. 「NOI2015」程序自动分析
题目链接 loj#2129. 「NOI2015」程序自动分析 题解 额... 考你会不会离散化优化常数 代码 #include<queue> #include<cstdio> ...
- [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机
[LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...
- [BZOJ4200][Noi2015]小园丁与老司机
4200: [Noi2015]小园丁与老司机 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 106 Solved ...
- [UOJ#132][BZOJ4200][luogu_P2304][NOI2015]小园丁与老司机
[UOJ#132][BZOJ4200][luogu_P2304][NOI2015]小园丁与老司机 试题描述 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 \(n\) 棵许愿 ...
- 【BZOJ4200】[Noi2015]小园丁与老司机 DP+最小流
[BZOJ2839][Noi2015]小园丁与老司机 Description 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 nn 棵许愿树,编号 1,2,3,…,n1,2, ...
随机推荐
- ABC108C - Triangular Relationship(打表)
题意 给出$n, k$,求出满足$a+b, b + c, c + a$都是$k$的倍数的三元组$a, b, c$的个数,$1 \leqslant a, b, c \leqslant N$ $n \le ...
- C++性能优化笔记
最近着手去优化项目中一个模块的性能.该模块是用C++实现,对大量文本数据进行处理. 一开始时,没什么思路,因为不知道性能瓶颈在哪里.于是借助perf工具来对程序进行分析,找出程序的性能都消耗在哪里了. ...
- 为什么90%的IT人员都不适合做老大?
什么是格局? 格局就是能够很好的平衡短期利益和长期利益. 过分注重短期利益的人必然会失去长期利益,到头来一定会很普通. 例如:跳槽不断,可能短期薪资会增长,但长期来看后劲可能会不足,未来发展空间会变窄 ...
- html5定位获取当前位置并在百度地图上显示
用html5的地理定位功能通过手机定位获取当前位置并在地图上居中显示出来,下面是百度地图API的使用过程,有需要的朋友可以参考下 在开发移动端 web 或者webapp时,使用百度地图 API 的过程 ...
- PhotoSwipe图片展示插件
这个插件相当棒!功能也很强大,可以自行体会. 官方网址:http://www.photoswipe.com/ github地址:https://github.com/codecomputerlove/ ...
- linux 的安装
3linux 软件安装 3.1 vm ware 软件安装 双击VMware-workstation-full-10.0.2-1744117.1398244508.exe 单击下一步 单击下一步 选择典 ...
- python3 包的发布
发布流程大概如下 1. 首先需要有一个python包,就是一个文件夹,但是此文件夹下面有__init__.py文件,里面内容是 现在要发布包TestMsg,这就是一个python包.在同级目录下新建s ...
- 字符编码笔记:ASCII、Unicode和UTF-8
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...
- 栈及其DFS:B - Parentheses Balance
解题心得及总结: 总结: 1.递推:又1推出n,数列中的基本到通项,最终目标得出通项公式. 递归:又n先压缩栈到1,再从函数的出口找到1,又1到n,再从n计算到1: 2.判断是否可以由递推或递推得出, ...
- LCS及方案数(DP)
Description 对于一个序列