*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, ...
随机推荐
- 转载:java分布式服务框架Dubbo的介绍与使用
1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- MitmProxy使用
安装 tar -zxvf mitmproxy-3.0.1-linux.tar.gz sudo mv mitmproxy mitmdump mitmweb /usr/bin 详情 https://ger ...
- 5-2 os模块
导入os模块 import os res = os.listdir('D:\study') # 列出某个目录下的所有文件 os.remove('newuser.json') # 删除某个目录下的某个文 ...
- nuxt.js express模板项目IIS部署
继续上一篇的nuxt/express项目部署,还是windows上要把nuxt的服务端渲染项目跑起来,这次的目的是用已经有的域名windows服务器上一个虚拟目录反向代理部署在其他端口nuxt项目. ...
- 20181229(守护进程,互斥锁,IPC,生产者和消费者模型)
一.守护进程 守护进程:一个进程B守护另一个进程A,当被守护的进程A结束,进程B也就结束了.(不一定同生,但会同死) 两个特点: ①守护进程会在主进程代码执行结束后就终止 ②守护进程内无法再开启子进程 ...
- 模拟:HDU1034-Candy Sharing Game
解题心得: 1.直接模拟每一次分一半就行了,模拟过程,记录轮数,但是也看到有些大神使用的是链表,估计链表才是真的做法吧. 题目: Candy Sharing Game Time Limit: 2000 ...
- 笔记-Python-cProfile
笔记-Python-cProfile 1. 简介python官方提供了cProfile和profile对程序进行性能分析,建议使用cProfile; cProfile:基于lsprof的用C语言实现的 ...
- kafka 的offset的重置
最近在spark读取kafka消息时,每次读取都会从kafka最新的offset读取.但是如果数据丢失,如果在使用Kafka来分发消息,在数据处理的过程中可能会出现处理程序出异常或者是其它的错误,会造 ...
- A JavaScript Image Gallery
childNodes property: The childNodes property is a way of getting information about the children of ...
- Android开发——常见的内存泄漏以及解决方案(二)
)Android2.3以后,SoftReference不再可靠.垃圾回收期更容易回收它,不再是内存不足时才回收软引用.那么缓存机制便失去了意义.Google官方建议使用LruCache作为缓存的集合类 ...