$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」小园丁与老司机的更多相关文章

  1. 「NOI2015」小园丁与老司机

    「NOI2015」小园丁与老司机 要不是这道码农题,去年就补完了NOI2015,其实两问都比较simple,但是写起来很恶心. 先解决第一问,记 \(dp[i]\) 表示老司机到达第 \(i\) 棵树 ...

  2. 【BZOJ4200】【NOI2015】小园丁与老司机(动态规划,网络流)

    [BZOJ4200][NOI2015]小园丁与老司机(动态规划,网络流) 题面 BZOJ权限题,洛谷链接 题解 一道二合一的题目 考虑第一问. 先考虑如何计算六个方向上的第一个点. 左右上很好考虑,只 ...

  3. UOJ132 【NOI2015】小园丁与老司机

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. loj#2009.「SCOI2015」小凸玩密室

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

  5. loj#2129. 「NOI2015」程序自动分析

    题目链接 loj#2129. 「NOI2015」程序自动分析 题解 额... 考你会不会离散化优化常数 代码 #include<queue> #include<cstdio> ...

  6. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...

  7. [BZOJ4200][Noi2015]小园丁与老司机

    4200: [Noi2015]小园丁与老司机 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 106  Solved ...

  8. [UOJ#132][BZOJ4200][luogu_P2304][NOI2015]小园丁与老司机

    [UOJ#132][BZOJ4200][luogu_P2304][NOI2015]小园丁与老司机 试题描述 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 \(n\) 棵许愿 ...

  9. 【BZOJ4200】[Noi2015]小园丁与老司机 DP+最小流

    [BZOJ2839][Noi2015]小园丁与老司机 Description 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 nn 棵许愿树,编号 1,2,3,…,n1,2, ...

随机推荐

  1. 以太坊国内节点大全(ropsten)

    admin.addPeer('enode://2d1e1f1242c3b54ea56046f74f15943f47ab410e3c0b82bffb501793ebb19e147f8f0e63d01c2 ...

  2. U盘装系统之winpe中常用安装win7的方法和备份(2013-01-15-bd 写的日志迁移

    首先到网上去下一个制作U盘启动的的软件比如老毛桃.大白菜.电脑城制作u盘启动软件[其实他们的装机界面和工具那些都差不多], 我是用的老毛桃至于制作流程你可以看它的视频你往下拉就可以看见,或者看说明,自 ...

  3. 静态属性property的本质和应用

    一.本质 静态属性property本质就是实现了get,set,delete三种方法 class Foo: @property def AAA(self): print('get的时候运行我啊') @ ...

  4. IIC如何释放数据总线? 为什么=1就是释放?

    最近看IIC原理,释放一词经常用遇到,在nxp的标准中也有看到,有点疑惑,因此百度,在百度知道中,有大佬的解释,可以看看何为“释放”,结合数字电子技术,应该可以理解了. 下面总结了一下三个解释何为“释 ...

  5. Problem E. TeaTree - HDU - 6430 (树的启发式合并)

    题意 有一棵树,每个节点有一个权值. 任何两个不同的节点都会把他们权值的\(gcd\)告诉他们的\(LCA\)节点.问每个节点被告诉的最大的数. 题解 第一次接触到树的启发式合并. 用一个set维护每 ...

  6. TI C6000优化手册——让代码看起来像钉子

    DSP芯片的出现,是为了解决大量的数字运算问题.通过集成专用的加法器.乘法器.地址产生器.复杂逻辑等硬件单元,DSP能实现比普通单片机更快速的数字运算,使处理器更适用于实时性高.复杂度强的处理场合.也 ...

  7. 8 REST Framework 实现Web API 1

    1 参考博客: http://blog.csdn.net/SVALBARDKSY/article/details/50548073 2  准备工作 1. 环境 Python: Python 3.5 D ...

  8. cogs:1619. [HEOI2012]采花/luogu P2056

    1619. [HEOI2012]采花 ★★☆   输入文件:1flower.in   输出文件:1flower.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 萧薰儿是 ...

  9. Spring MVC 使用 HttpServletResponseWrapper 修改返回结果

    HttpServletResponseWrapper 是什么? ServletResponse 的包装类,相关设计模式 装饰者模式. 运行环境 jdk 1.7 spring boot 整合的web环境 ...

  10. vue2.x生命周期

    vue2.x生命周期 1. beforeCreate 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用. 2. created 实例已经创建 ...