[Noi2015]小园丁和老司机
来自FallDream的博客,未经允许,请勿转载,谢谢。
小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面。田野上有n棵许愿树,编号1,2,3,…,n,每棵树可以看作平面上的一个点,其中第 i棵树 (1≤i≤n) 位于坐标(xi,yi)。任意两棵树的坐标均不相同。
老司机 Mr. P从原点(0,0)驾车出发,进行若干轮行动。每一轮,Mr.P首先选择任意一个满足以下条件的方向:
1.为左、右、上、左上45∘、右上45∘五个方向之一。
2.沿此方向前进可以到达一棵他尚未许愿过的树。
完成选择后,Mr.P沿该方向直线前进,必须到达该方向上距离最近的尚未许愿的树,在树下许愿并继续下一轮行动。如果没有满足条件的方向可供选择,则停止行动。他会采取最优策略,在尽可能多的树下许愿。若最优策略不唯一,可以选择任意一种。
不幸的是,小园丁Mr.S 发现由于田野土质松软,老司机Mr.P的小汽车在每轮行进过程中,都会在田野上留下一条车辙印,一条车辙印可看作以两棵树(或原点和一棵树)为端点的一条线段。
在 Mr.P之后,还有很多许愿者计划驾车来田野许愿,这些许愿者都会像Mr.P一样任选一种最优策略行动。Mr. S 认为非左右方向(即上、左上45∘、右上 45∘三个方向)的车辙印很不美观,为了维护田野的形象,他打算租用一些轧路机,在这群许愿者到来之前夯实所有“可能留下非左右方向车辙印”的地面。“可能留下非左右方向车辙印”的地面应当是田野上的若干条线段,其中每条线段都包含在某一种最优策略的行进路线中。每台轧路机都采取满足以下三个条件的工作模式:
1.从原点或任意一棵树出发。
2.只能向上、左上45∘、右上45∘三个方向之一移动,并且只能在树下改变方向或停止。
3.只能经过“可能留下非左右方向车辙印”的地面,但是同一块地面可以被多台轧路机经过。
现在 Mr.P和Mr.S分别向你提出了一个问题:
1.请给 Mr .P 指出任意一条最优路线。
2.请告诉 Mr. S 最少需要租用多少台轧路机。
第一问谁都会 就是个sbdp , y坐标相同的一起转移
然后第二问看出求的是最少的链覆盖所有边 所以用上有源汇带上下界最小流 就行啦
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define MN 50000
#define S 0
#define TT 50004
#define SS 50002
#define T 50003
#define INF 2000000000
#define pa pair<int,int>
#define mp(x,y) make_pair(x,y)
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} struct Point{int x,y,id;}a[MN+],b[MN+],c[MN+],d[MN+];
struct edge{int to,next,w;}e[];
int pos1[MN+],pos2[MN+],pos3[MN+],aa[MN+],pos4[MN+],n,f[MN+],g[MN+],h[MN+],ans=,F[MN+];
int head[T+],D[T+],cnt=,C[T+],q[MN+],top=,in[MN+],out[MN+],lt[MN+],rt[MN+];
vector<pa> to[MN*+];int mark[MN*+];
bool cmp1(Point a,Point b){return a.y==b.y?a.x<b.x:a.y<b.y;}
bool cmp2(Point a,Point b){return a.x==b.x?a.y<b.y:a.x<b.x;}
bool cmp3(Point a,Point b){return (a.x-a.y==b.x-b.y)?a.y<b.y:(a.x-a.y<b.x-b.y);}
bool cmp4(Point a,Point b){return (a.x+a.y==b.x+b.y)?a.y<b.y:(a.x+a.y<b.x+b.y);}
inline void R(int&a,int b){if(b>a)a=b;}
inline void ins(int f,int t,int w)
{
e[++cnt]=(edge){t,head[f],w};head[f]=cnt;
e[++cnt]=(edge){f,head[t],};head[t]=cnt;
++out[f];++in[t];
}
void Solve(int i)
{
if(pos2[a[i].id]>&&b[pos2[a[i].id]-].x==a[i].x)
R(f[a[i].id],f[b[pos2[a[i].id]-].id]+);
if(pos3[a[i].id]>&&c[pos3[a[i].id]-].x-c[pos3[a[i].id]-].y==a[i].x-a[i].y)
R(f[a[i].id],f[c[pos3[a[i].id]-].id]+);
if(pos4[a[i].id]>&&d[pos4[a[i].id]-].x+d[pos4[a[i].id]-].y==a[i].x+a[i].y)
R(f[a[i].id],f[d[pos4[a[i].id]-].id]+);
} void Work(int i,int id,int tot)
{
if(pos2[a[i].id]>&&b[pos2[a[i].id]-].x==a[i].x&&f[b[pos2[a[i].id]-].id]==tot-)
to[id].push_back(mp(b[pos2[a[i].id]-].id,));
if(pos3[a[i].id]>&&c[pos3[a[i].id]-].x-c[pos3[a[i].id]-].y==a[i].x-a[i].y&&f[c[pos3[a[i].id]-].id]==tot-)
to[id].push_back(mp(c[pos3[a[i].id]-].id,));
if(pos4[a[i].id]>&&d[pos4[a[i].id]-].x+d[pos4[a[i].id]-].y==a[i].x+a[i].y&&f[d[pos4[a[i].id]-].id]==tot-)
to[id].push_back(mp(d[pos4[a[i].id]-].id,));
} void Dfs(int I,int K,bool flag)
{
if(I==n)return;int H=I+(K>)*n;
if(mark[H])return;mark[H]=;to[H].clear();
if(f[I]!=F[I]||(!mark[I]&&K==)||(!mark[I+n]&&K==))
{
Work(pos1[I],H,K&?f[I]:F[I]);
for(int ii=;ii<to[H].size();++ii)
{
ins(to[H][ii].first,I,INF),Dfs(to[H][ii].first,to[H][ii].second,flag);
if(flag) printf("%d ",I),flag=;
}
}
to[H].clear();int i=pos1[I],j,k;
if(K&)
{
for(j=i;j&&a[j].y==a[i].y;--j);++j;
for(k=i;k<=n&&a[k].y==a[i].y;++k);--k;
for(int l=j;l<i;++l)
if(f[I]==F[a[l].id]+i-j)
to[H].push_back(mp(a[l].id,));
for(int ii=;ii<to[H].size();++ii)
{
Dfs(to[H][ii].first,to[H][ii].second,flag);
if(flag)
{
for(int l=pos1[to[H][ii].first]-;l>=j;--l) printf("%d ",a[l].id);
for(int l=pos1[to[H][ii].first]+;l<=i;++l) printf("%d ",a[l].id);
flag=;
}
}
to[H].clear();
for(int l=k;l>i;--l)
if(f[I]==F[a[l].id]+k-i)
to[H].push_back(mp(a[l].id,));
for(int ii=;ii<to[H].size();++ii)
{
Dfs(to[H][ii].first,to[H][ii].second,flag);
if(flag)
{
for(int l=pos1[to[H][ii].first]+;l<=k;++l) printf("%d ",a[l].id);
for(int l=pos1[to[H][ii].first]-;l>=i;--l) printf("%d ",a[l].id);
flag=;
}
}
}to[H].clear();
} int dfs(int x,int f)
{
if(x==TT) return f;
int used=;
for(int&i=C[x];i;i=e[i].next)
if(e[i].w&&D[e[i].to]==D[x]+)
{
int w=dfs(e[i].to,min(e[i].w,f-used));
used+=w;e[i].w-=w;e[i^].w+=w;
if(f==used) return f;
}
return D[x]=-,used;
} bool bfs()
{
memset(D,,sizeof(D));int i,j;
for(D[q[top=i=]=SS]=;i<=top;++i)
for(j=C[q[i]]=head[q[i]];j;j=e[j].next)
if(e[j].w&&!D[e[j].to]) D[q[++top]=e[j].to]=D[q[i]]+;
return D[TT];
} int main()
{
n=read();memset(f,,sizeof(f));f[n+]=;
for(int i=;i<=n;++i)
a[i].x=b[i].x=c[i].x=d[i].x=read(),
a[i].y=b[i].y=c[i].y=d[i].y=read(),
a[i].id=b[i].id=c[i].id=d[i].id=i;
++n;a[n].id=b[n].id=c[n].id=d[n].id=n;
sort(a+,a+n+,cmp1);sort(b+,b+n+,cmp2);
sort(c+,c+n+,cmp3);sort(d+,d+n+,cmp4);
for(int i=;i<=n;++i) pos1[a[i].id]=pos2[b[i].id]=pos3[c[i].id]=pos4[d[i].id]=i;
for(int i=,j;i<=n;i=j+)
{
for(j=i;j<=n&&a[j].y==a[i].y;++j)
Solve(j),F[a[j].id]=f[a[j].id];
--j;g[i-]=h[j+]=-INF;
for(int k=i;k<=j;++k) g[k]=max(g[k-],f[a[k].id]);
for(int k=j;k>=i;--k) h[k]=max(h[k+],f[a[k].id]);
for(int k=i;k<=j;++k) R(f[a[k].id],max(g[k-]+k-i,h[k+]+j-k));
for(int k=i;k<=j;++k) R(ans,f[a[k].id]);
}
printf("%d\n",ans);bool Flag=;
for(int i=;i<=n;++i) if(f[i]==ans) Dfs(i,,Flag),Flag=false;
puts("");ans=;
for(int i=;i<=n;++i)
if(in[i]<out[i]) ins(i,TT,out[i]-in[i]);
else if(out[i]<in[i]) ins(SS,i,in[i]-out[i]);
for(int i=;i<=n;++i) ins(S,i,INF),ins(i,T,INF);
while(bfs()) ans+=dfs(SS,INF);ins(T,S,INF);
while(bfs()) ans+=dfs(SS,INF);
printf("%d\n",e[cnt].w);
return ;
}
[Noi2015]小园丁和老司机的更多相关文章
- [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, ...
- luogu P2304 [NOI2015]小园丁与老司机 dp 上下界网络流
LINK:小园丁与老司机 苦心人 天不负 卧薪尝胆 三千越甲可吞吴 AC的刹那 真的是泪目啊 很久以前就写了 当时记得特别清楚 写到肚子疼.. 调到胳膊疼.. ex到根不不想看的程度. 当时wa了 一 ...
- [BZOJ]4200: [Noi2015]小园丁与老司机
Time Limit: 20 Sec Memory Limit: 512 MBSec Special Judge Description 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维 ...
- uoj132/BZOJ4200/洛谷P2304 [Noi2015]小园丁与老司机 【dp + 带上下界网络流】
题目链接 uoj132 题解 真是一道大码题,,,肝了一个上午 老司机的部分是一个\(dp\),观察点是按\(y\)分层的,而且按每层点的上限来看可以使用\(O(nd)\)的\(dp\),其中\(d\ ...
- BZOJ4200 & 洛谷2304 & UOJ132:[NOI2015]小园丁与老司机——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4200 https://www.luogu.org/problemnew/show/P2304 ht ...
- 【bzoj4200】[Noi2015]小园丁与老司机 STL-map+dp+有上下界最小流
题目描述 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 nn 棵许愿树,编号 1,2,3,…,n1,2,3,…,n,每棵树可以看作平面上的一个点,其中第 ii 棵树 (1≤ ...
- 【洛谷2304_LOJ2134】[NOI2015]小园丁与老司机(动态规划_网络流)
题目: 洛谷 2304 LOJ 2134 (LOJ 上每个测试点有部分分) 写了快一天 -- 好菜啊 分析: 毒瘤二合一题 -- 注意本题(及本文)使用 \(x\) 向右,\(y\) 向上的「数学坐标 ...
随机推荐
- 怎么去理解JAVA中类与对象的关系
首先要明确,在现实生活中,每一个物体都有自己的基本特征,专业一点也可以说成是属性有些甚至还有一定的行为.例如 汽车的特征:有车门.有轮胎.颜色各一等等,行为:有行驶,开车门,开车灯,等等.有这些属性和 ...
- 【iOS】swift 保持代码优美的10个方法
这篇Swift风格指南与你看到的其他的指南有所不同,此篇指南主要焦点集中在打印和Web展示的可读写上.我们创建此篇风格指南的目的,是为了让我们的图书.教程以及初学者套件中的代码保持优美和一致,即使我们 ...
- slf4j 与 log4j2 实战讲解与日志分割
这两天搭建项目的时候用到log4j2在这里把自己的问题与了解拿出来与大家分享一下. 1.为什我要用 因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用l ...
- WIN10系统触摸板快捷键
快捷的手势操作,有时候会让人脱离鼠标,只要不是非用不可的情况,基本上这些常用手势就能让我们摆脱鼠标携带不便或者桌子地方小的烦恼.iOS上的快捷手势很是受欢迎,win10上却鲜有人知晓,尤其是非开发人员 ...
- api-gateway实践(14)前端签名密钥和后端签名密钥
1.前端签名密钥 1.1.缓存管理初始:engine初始的时候,从redis拉取全部前端绑定关系到engine缓存.新增/绑定:绑定签名密钥和服务实例,同时缓存该关系到redis,同时缓存到engin ...
- api-gateway实践(13)新服务网关 - 断路保护/熔断机制
参考链接:SpringCloud的Hystrix(五) Hystrix机制 新需求列表 1.在线测试 根据定义,生成输入界面, 点击测试, 验证参数,发起调用,返回执行结果 2.熔断保护 两个实现类: ...
- ELK学习总结(3-3)elk的组合查询
1.bool 查询: must: 必须 should: 可以满足,也可以不满足. must_not: minimum_should_match: 至少要x个匹配才算匹配成功 disable_coor ...
- 大数据学习总结(7)we should...
大数据场景一.各种标签查询 查询要素:人.事.物.单位 查询范围:A范围.B范围.... 查询结果:pic.name.data from 1.痛点:对所有文本皆有实时查询需求2.难点:传统SQL使用W ...
- 阿里云API网关(5)用户指南(调用 API)
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- C# 文件的一些基本操作
近期程序中经常用到一些文件的操作,现在大致整理一下. 一. 获取文件或文件夹基本信息 1.获取文件信息,组成一个DataTable信息. /// <summary> /// 获取指定目录下 ...