【bzoj 4449】[Neerc2015]Distance on Triangulation
2018-04-22 20:45
471 查看
Description
给定一个凸n边形,以及它的三角剖分。再给定q个询问,每个询问是一对凸多边行上的顶点(a,b),问点a最少经过多少条边(可以是多边形上的边,也可以是剖分上的边)可以到达点b。
Input
第一行一个整数n(n <= 50000),代表有n个点。点1,2,3,…,n是凸多边形上是顺时针排布的。
接下来n-3行,每行两个整数(x,y),代表(x,y)之间有一条剖分边。
接下来是一个整数q(q <= 100000),代表有q组询问。
接下来q行是两个整数(a,b)。Output
输出q行,每行一个整数代表最少边数。
运用分治的思想,每一次选择一条剖分边,使得凸多边形分成尽量平均的两部分。使用bfs得出该条边的两个端点到各个顶点的最短路,对所有的询问在两个端点处进行拼凑并更新答案。然后对两部分的信息分别划开,进行下一层的分治。
(每次分治完,点数会比原来多2,所以空间要开三倍。)
#include<cstdio> #include<algorithm> #include<cstring> #define LL long long using namespace std; const int N=3e5+5; const int inf=0x3f3f3f3f; int n,m,cnt,x,y,t,tmp; int first ,ans ,id ; int qq ,disx ,disy ,q1 ,q2 ; bool ok ; struct node{int x,y,id;}l ,q ,h1 ,h2 ; struct edge{int to,next;}e[N<<1]; int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } void ins(int u,int v){e[++cnt]=(edge){v,first[u]};first[u]=cnt;} int find(int l,int r,int x){return lower_bound(id+l,id+r+1,x)-id;} void bfs(int S,int pl,int pr,int *dis) { int head=0,tail=0; for(int i=pl;i<=pr;i++)dis[id[i]]=inf; qq[tail++]=S;dis[S]=0; while(head!=tail) { int u=qq[head++]; for(int i=first[u];i;i=e[i].next) { int to=e[i].to; if(!ok[to])continue; if(dis[to]==inf)dis[to]=dis[u]+1,qq[tail++]=to; } } } void work(int dl,int dr,int pl,int pr,int ql,int qr) { if(dl>dr||pl>pr||ql>qr)return; int mn=inf,mnid=0; for(int i=dl;i<=dr;i++) { x=find(pl,pr,l[i].x);y=find(pl,pr,l[i].y); if(x>y)swap(x,y); tmp=max(y-x,x-y+pr-pl+1); if(tmp<mn)mn=tmp,mnid=i; } for(int i=pl;i<=pr;i++)ok[id[i]]=true; bfs(l[mnid].x,pl,pr,disx); bfs(l[mnid].y,pl,pr,disy); for(int i=pl;i<=pr;i++)ok[id[i]]=false; int t1=0,t2=0,t3=0,t4=0,t5=0,t6=0; for(int i=ql;i<=qr;i++) { x=q[i].x;y=q[i].y;t=q[i].id; if(x==l[mnid].x&&y==l[mnid].y){ans[t]=1;continue;} ans[t]=min(ans[t],disx[x]+disx[y]); ans[t]=min(ans[t],disy[x]+disy[y]); ans[t]=min(ans[t],disx[x]+disy[y]+1); ans[t]=min(ans[t],disy[x]+disx[y]+1); if(q[i].x>l[mnid].x&&q[i].y<l[mnid].y)h1[++t1]=q[i]; else if((q[i].x<l[mnid].x||q[i].x>l[mnid].y)&& (q[i].y<l[mnid].x||q[i].y>l[mnid].y))h2[++t2]=q[i]; } for(int i=1;i<=t1;i++)q[ql+i-1]=h1[i]; for(int i=1;i<=t2;i++)q[ql+t1+i-1]=h2[i]; for(int i=pl;i<=pr;i++) { if(id[i]>=l[mnid].x&&id[i]<=l[mnid].y)q1[++t3]=id[i]; if(id[i]<=l[mnid].x||id[i]>=l[mnid].y)q2[++t4]=id[i]; } for(int i=1;i<=t3;i++)id[pl+i-1]=q1[i]; for(int i=1;i<=t4;i++)id[pl+t3+i-1]=q2[i]; for(int i=dl;i<=dr;i++) { if(i==mnid)continue; if(l[i].x>=l[mnid].x&&l[i].y<=l[mnid].y)h1[++t5]=l[i]; else h2[++t6]=l[i]; } for(int i=1;i<=t5;i++)l[dl+i-1]=h1[i]; for(int i=1;i<=t6;i++)l[dl+t5+i-1]=h2[i]; work(dl+t5,dl+t5+t6-1,pl+t3,pl+t3+t4-1,ql+t1,ql+t1+t2-1); work(dl,dl+t5-1,pl,pl+t3-1,ql,ql+t1-1); } int main() { n=read(); for(int i=1;i<=n-3;i++) { l[i].x=read();l[i].y=read(); ins(l[i].x,l[i].y);ins(l[i].y,l[i].x); if(l[i].x>l[i].y)swap(l[i].x,l[i].y); } for(int i=1;i<n;i++)ins(i,i+1),ins(i+1,i); ins(1,n);ins(n,1); m=read(); for(int i=1;i<=m;i++) { q[i].x=read();q[i].y=read();q[i].id=i; if(q[i].x>q[i].y)swap(q[i].x,q[i].y); ans[i]=min(q[i].y-q[i].x,q[i].x-q[i].y+n); } for(int i=1;i<=n;i++)id[i]=i; work(1,n-3,1,n,1,m); for(int i=1;i<=m;i++)printf("%d\n",ans[i]); return 0; }View Code
相关文章推荐
- [NEERC 2015] bzoj4449 Distance on Triangulation [分治+最短路]
- BZOJ4449: [Neerc2015]Distance on Triangulation
- bzoj 4449: [Neerc2015]Distance on Triangulation
- BZOJ4449 : [Neerc2015]Distance on Triangulation
- [BZOJ4449][Neerc2015][分治][最短路]Distance on Triangulation
- 【BZOJ 4449】[Neerc2015]Distance on Triangulation 多边形分治结构
- [点分治 离线] BZOJ 4449 [Neerc2015]Distance on Triangulation
- [BZOJ]4404: [Neerc2015]Binary vs Decimal
- [仙人掌 并查集 组合计数] BZOJ 4450 [Neerc2015]Cactus Jubilee
- bzoj 4404 [Neerc2015]Binary vs Decimal题解
- [乱搞 高精度] BZOJ 4404 [Neerc2015]Binary vs Decimal
- bzoj4395【Usaco2015 Dec】Switching on the Lights
- [BZOJ 4380] POI 2015 Myjnie
- 【BZOJ3998】【TJOI2015】弦论
- bzoj 4292: [PA2015]Równanie
- bzoj 4031 [HEOI2015]小Z的房间 Matrix-tree定理
- 【PA2015】【BZOJ4297】Rozstaw szyn
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest F - Infinite Go
- BZOJ 4197: [Noi2015]寿司晚宴
- 【BZOJ】4326 NOIP2015 运输计划 二分+LCA+树上差分