*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, ...
随机推荐
- EasyUI获取正在编辑状态行的索引
function getRowIndex(target){ var tr = $(target).closest("tr.datagrid-row"); return paseIn ...
- Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章
二.伯乐在线爬取所有文章 1. 初始化文件目录 基础环境 python 3.6.5 JetBrains PyCharm 2018.1 mysql+navicat 为了便于日后的部署:我们开发使用了虚拟 ...
- Python 正则表达式 匹配次数
管道可以匹配多个正则表达式中的一个 >>> >>> m=re.search(r'Batman|Tina Fey','Batman and Tina Fey')> ...
- JZOJ 4757. 树上摩托
Description Sherco是一位经验丰富的魔♂法师.Sherco在第零次圣杯战争中取得了胜利,并取得了王之宝藏——王の树.他想把这棵树砍去任意条边,拆成若干棵新树,并装饰在他的摩托上,让他的 ...
- php实现的三个常用加密解密功能函数示例
目录 算法一: 算法二: 算法三(改进第一个加密之后的算法) 本文实例讲述了php实现的三个常用加密解密功能函数.分享给大家供大家参考,具体如下: 算法一: //加密函数 function lock_ ...
- GoF23种设计模式之创建型模式之工厂方法模式
一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...
- (转)iOS静态库与动态库的区别
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用 ...
- stm32基本定时器timer6的原理与使用
/********************基本定时器 TIM 参数定义,只限 TIM6.7************/ /* 一.定时器分类 STM32F1 系列中,除了互联型的产品,共有 8 个定时器 ...
- 使用FileSystem类进行文件读写及查看文件信息
使用FileSystem类进行文件读写及查看文件信息 在这一节我们要深入了解Hadoop的FileSystem类——这是与与hadoop的文件系统交互的重要接口.虽然我们只是着重于HDFS的实现, ...
- main方法中sleep
sleep(long mil); 你应该 加 休眠的时间才行 一.Thread.sleep(1000); 二.让你的class extends Thread来继承 sleep方法