[JZOJ5049] 腐女的生日
来源:互联网 发布:php接口压力测试工具 编辑:程序博客网 时间:2024/04/30 19:17
Description
腐女要过生日了,pty 想给腐女送礼物,但是腐女所在的教室离pty 的教室太远了,于是pty就拜托会动归和A星的djy帮忙送礼物。djy在学校建立了一个平面直角坐标系,他站在了(0,0)点,腐女在(x0,y0)点,djy每次只能往上下左右四个方向移动一步,中间有n栋矩形教学楼,每个教学楼给出两个对角的坐标,并且保证每栋教学楼的周围区域(如图所示)不会有别的教学楼,即djy可以绕一个教学楼走不会碰到任何障碍,现在djy 想知道从起点到终点不碰到任何教学楼,最短需要多少步。
保证每个矩形都不相交,且一个矩形的周围区域不会有别的矩形。
保证所有的y坐标在[-10^6,10^6]
所有的x坐标在[0,10^6]
70%的数据保证:n<=1000
100%的数据保证:n<=10^5
Solution
这题根据经验,我一开始想的是最短路。
对于每个矩形,显然只有左边界上下的点在向外左上左下一个点是有用的。
将这两个点作为关键点。
并且我们发现,除非有一个矩阵锁住起点(就是横坐标为0),一定不可能向左走的。
事实证明并没有这种数据,有的话特判一下就好。
对于当前到达的一个点,观察发现,上下的所有矩阵都不能阻挡它,只有它右边第一个上比它高下比它低的矩阵能影响。
那么这个点和那个矩阵的关键点连边,递归下去。
碰到终点直接连。
然后出来是一个DAG,直接跑拓扑序就好。
但是连边最坏是
所以我的是水法,然而数据比较辣鸡,让我过了。
正解是扫描线。
线段树维护一个扫描线,记录起点到扫描线上每个点的距离,用关于纵坐标一次函数表示,向右更新时直接区间操作一次函数的系数和常数项即可。
Code
我的是最短路
#include <cstdio>#include <cstdlib>#include <algorithm>#include <iostream>#include <cstring>#include <cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)#define N 500005using namespace std;int n,m,n1,nt[4*N],dt[4*N],fs[N],pr[4*N],xl,yl,d[2*N],dis[2*N],st,ed,b1[N],ds[2*N],rd[2*N];bool bz[2*N];struct node{ int x,hi,lw;}z[N];void spfa(){ memset(dis,107,sizeof(dis)); memset(bz,0,sizeof(bz)); dis[st]=0; bz[st]=1;d[1]=st; int l=0,r=1; while(l<r) { l++; int l1=l%(2*N); int p=d[l1]; for(int i=fs[p];i;i=nt[i]) { int q=dt[i]; rd[q]--; if(dis[q]>dis[p]+pr[i]&&dis[p]+pr[i]<dis[ed]) dis[q]=dis[p]+pr[i]; if(!bz[q]&&rd[q]==0) { bz[q]=1; r++; d[r%(2*N)]=q; } } }}void link(int p,int q,int v){ nt[++m]=fs[p]; fs[p]=m; rd[q]++; dt[m]=q; pr[m]=v;}bool cmp(node x,node y){ return (x.x<y.x)||(x.x==y.x&&x.hi==yl)||(x.x==y.x&&x.hi!=yl&&x.hi>y.hi);}void dfs(int y,int k,int p,int s){ ds[p]=s; fo(i,k+1,n) { if(z[i].lw<y&&z[i].hi>y) { bool pd=0; if(!b1[i]) b1[i]=++n1,n1++,pd=1; if(abs(z[i].hi-y)>abs(y-z[i].lw)) { link(p,b1[i],abs(z[i].hi-y)); link(p,b1[i]+1,abs(y-z[i].lw)); } else { link(p,b1[i]+1,abs(y-z[i].lw)); link(p,b1[i],abs(z[i].hi-y)); } if(pd) { dfs(z[i].hi,i,b1[i],s+abs(z[i].hi-y)); dfs(z[i].lw,i,b1[i]+1,s+abs(y-z[i].lw)); } break; } if(z[i].lw==yl&&z[i].x==xl) { if(!ed) ed=++n1; link(p,ed,abs(z[i].hi-y)); break; } }}int main(){ cin>>xl>>yl; cin>>n; st=1; z[1].x=z[1].hi=z[1].lw=0; n++; fo(i,2,n) { int x,y,p,q; scanf("%d %d %d %d",&x,&y,&p,&q); if(y>q) swap(y,q); if(x>p) swap(x,p); x--,q++,y--; z[i].x=x,z[i].hi=q,z[i].lw=y; } z[++n].x=xl,z[n].hi=z[n].lw=yl; sort(z+1,z+n+1,cmp); st=1,ed=0; int i=1; n1=1; while(z[i].x<0&&z[i].lw!=0) i++; memset(ds,107,sizeof(ds)); dfs(0,i,1,0); spfa(); printf("%d\n",dis[ed]+xl);}
- [JZOJ5049] 腐女的生日
- 【jzoj5049】【腐女的生日】【扫描线】【数据结构】
- 【JZOJ5049】【GDOI2017模拟一试4.11】腐女的生日
- {题解}[jzoj5049]【GDOI2017模拟一试4.11】腐女的生日
- 腐女的生日
- 5049. 腐女的生日
- 【JZOJ 5049】 腐女的生日
- 【GDOI2017模拟一试4.11】腐女的生日
- 日常训练 腐女的生日 奥妙重重的最短路
- BZOJ 5049. 【GDOI2017模拟一试4.11】腐女的生日
- 【GDOI2017模拟一试4.11】腐女的生日(线段树+维护一次函数)
- 论一个腐女的养成
- 真正的女人味
- 无所不在的超女
- 书女的淑女
- 嫁不掉的女光棍
- 程序员的女人们
- 女程序员的启程
- leetcode 38
- MYSQL explain详解
- 使用commons-vfs监听文件系统
- Z字形遍历矩阵
- eclipse(springmvc+spring+mybatis)(上)
- [JZOJ5049] 腐女的生日
- POJ 3177 Redundant Paths(边双连通分量+缩点)
- SPP-Net论文学习(2)
- hdu 3033 分组背包,每组最少取一个
- ffmpeg源码简析(六)编码-av_write_frame(),av_write_trailer()
- 构建自己的违例 和 finally
- 容器的内嵌类——迭代器
- PHP 对接招商银行网银接口
- ZOJ Problem Set