*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, ...
随机推荐
- IE支持直接查看Json数据注册表代码
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json] ...
- 26.VUE学习之--提交表单不刷新页面,事件修饰符之使用$event与prevent修复符操作表单
提交表单不刷新页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Oracle 数据库密码过期问题
(1)在CMD命令窗口中输入: sqlplus 用户名/密码@数据库本地服务名 as sysdba;(如:sqlplus scott/1234@oracle1 as sysdba; ...
- sql:where中多种状况简便写法
字段名:Bran,block,are ,store 四个字段中存在值等于0或者不等于0,两种情况.where中如果用if等条件判断会有16中组合,如果采用where中的条件就避免了这个情况. decl ...
- JSP自定义tld方法标签
卧槽 我们可以通过tld文件,自定义一个方法标签,以便在页面中使用,目录通常放在WEB-INF下面的tlds文件夹: 引入方式示例,直接在jsp上引入tld标签文件: <%@ taglib pr ...
- 3 - JVM随笔分类(gc.log ,VisualVM插件介绍,VisualVM远程连接方式介绍)
gc.log 354.2 KB 对于对应用的监控上可以使用Jdk自带的VisualVM来做可视化监控,可以查看当前服务应用进程的堆大小的走向,以及类的加载数量等,除此之外,VisualVM可以支持很多 ...
- N宫格
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- Vue+Django REST framework打造生鲜电商项目
1-1 课程导学 2-1 Pycharm的安装和简单使用 2-2 MySQL和Navicat的安装和使用 2-3 Windows和Linux下安装Python2和Python3 2-4 虚拟环境的安装 ...
- WPF TextBlock 调整下划线与文字的距离
<TextBlock Foreground="> <TextBlock.TextDecorations> <TextDecorationCollection&g ...
- input框的限制(仅数字以及电话号码的限制)
电话号码限制 <input type="text" id="phone" maxlength="11" onkeyup=" ...