bzoj 4449: [Neerc2015]Distance on Triangulation
Description
给定一个凸n边形,以及它的三角剖分。再给定q个询问,每个询问是一对凸多边行上的顶点(a,b),问点a最少经过多少条边(可以是多边形上的边,也可以是剖分上的边)可以到达点b。
Input
第一行一个整数n(n <= 50000),代表有n个点。点1,2,3,…,n是凸多边形上是顺时针排布的。
Output
#include<bits/stdc++.h>
char buf[],*ptr=buf+;
int G(){
if(ptr-buf==)fread(ptr=buf,,,stdin);
return *ptr++;
}
int _(){
int x=;
if(ptr-buf<){
while(*ptr<)++ptr;
while(*ptr>)x=x*+*ptr++-;
}else{
int c=G();
while(c<)c=G();
while(c>)x=x*+c-,c=G();
}
return x;
}
const int N=,inf=0x3f3f3f3f,P=;
int n,qp,idp=;
int deg[N],q[N],ql=,qr=,as[N];
std::vector<int>e0[N],ee[N];
struct Q{int w,id;};
std::vector<Q>qq[N];
Q*qs[N][];
int sz[N],*lr[N][],*et[N][];
int p3[N][];
void ae(int a,int b){
++deg[b];++deg[a];
e0[a].push_back(b);
e0[b].push_back(a);
} struct hash_map{
int h[P][];
int*operator()(int a,int b){
if(a>b)std::swap(a,b);
int w=(a*+b*)%P;
while(h[w][]){
if(h[w][]==a&&h[w][]==b)return h[w]+;
if((w+=)>=P)w-=P;
}
h[w][]=a,h[w][]=b;
return h[w]+;
}
}h1,h2;
void chk(int a,int b){
if(a>b)std::swap(a,b);
if(a==&&b==n||a+==b)return;
int*w=h1(a,b);
if(w[]){
int x=idp,y=w[];
ee[x].push_back(y);
ee[y].push_back(x);
int*c=h2(x,y);
c[]=a;c[]=b;
}else w[]=idp;
}
int ss[N][],sp,tk=,ed[N],ed2[N];
int ps[N],pp=;
void ins(int a){
for(int t=;t<;++t){
int w=p3[a][t];
if(ed2[w]!=tk)ed2[ps[pp++]=w]=tk;
}
}
void f2(int w,int pa){
sz[w]=;
ed[w]=tk;
ss[sp][]=w,ss[sp++][]=pa;
for(int*l=lr[w][],*r=lr[w][];l!=r;++l){
int u=*l;
if(u==pa)continue;
f2(u,w);
sz[w]+=sz[u];
}
}
void dele(int a,int b){
for(int*l=lr[a][],*r=lr[a][];l!=r;++l)if(*l==b){
*l=*--lr[a][];
return;
}
}
int min(int a,int b){return a<b?a:b;}
void mins(int&a,int b){if(a>b)a=b;}
int d1[N],d2[N],dd1[N],dd2[N],dk=;
bool qd[N];
void bfs(int w,int*d,int*dd){
ql=qr=;
dd[q[++qr]=w]=dk,d[w]=;
while(ql!=qr){
w=q[++ql];
for(int*l=et[w][],*r=et[w][];l!=r;++l){
int u=*l;
if(ed2[u]==tk&&dd[u]!=dk)dd[q[++qr]=u]=dk,d[u]=d[w]+;
}
}
}
void f1(int w){
++tk;
pp=;
sp=;
f2(w,);
int SZ=sz[w];
if(SZ>){
int mx=,p1=w,p2=;
for(int i=;i<sp;++i){
int u=ss[i][],mv=min(sz[u],SZ-sz[u]);
if(mv>mx)mx=mv,p1=u,p2=ss[i][];
ins(u);
}
dele(p1,p2);
dele(p2,p1);
int*ns=h2(p1,p2);
++dk;
bfs(ns[],d1,dd1);bfs(ns[],d2,dd2);
for(int i=;i<pp;++i){
int u=ps[i];
int d1u=d1[u];
int d2u=d2[u];
for(Q*l=qs[u][],*r=qs[u][];l!=r;++l){
int v=l->w;
if(qd[v])*l--=*(qs[u][]=--r);
else if(ed2[v]==tk){
int d1v=d1[v];
int d2v=d2[v];
mins(as[l->id],min(min(d1u+d1v,d2u+d2v),min(d1u+d2v+,d2u+d1v+)));
}
}
}
qd[ns[]]=qd[ns[]]=;
for(int d=;d<;++d)qs[ns[d]][]=qs[ns[d]][];
f1(p1);f1(p2);
}
}
int main(){
n=_();
for(int i=,a,b;i<=n-;++i){
a=_();b=_();
ae(a,b);
}
for(int i=;i<=n;++i)ae(i,i==n?:i+);
for(int i=;i<=n;++i){
et[i][]=e0[i].data();
et[i][]=et[i][]+e0[i].size();
}
for(int i=;i<=n;++i)if(deg[i]==)q[++qr]=i;
while(ql!=qr){
int w=q[++ql];
if(deg[w]!=)break;
deg[w]=;
int cs[],cp=;
cs[cp++]=w;
for(int*l=et[w][],*r=et[w][];l!=r;++l){
int u=*l;
if(!deg[u])continue;
cs[cp++]=u;
if(==--deg[u])q[++qr]=u;
}
++idp;
for(int i=;i<;++i){
for(int j=;j<i;++j)chk(cs[i],cs[j]);
p3[idp][i]=cs[i];
}
}
for(int i=;i<=idp;++i){
lr[i][]=ee[i].data();
lr[i][]=lr[i][]+ee[i].size();
}
qp=_();
for(int i=;i<qp;++i){
int x=_(),y=_();
if(x==y)continue;
if(x>y)std::swap(x,y);
if(x==&&y==n||x+==y||h1(x,y)[]){
as[i]=;
continue;
}
as[i]=inf;
qq[x].push_back((Q){y,i});
qq[y].push_back((Q){x,i});
}
for(int i=;i<=idp;++i){
qs[i][]=qq[i].data();
qs[i][]=qs[i][]+qq[i].size();
}
f1();
for(int i=;i<qp;++i)printf("%d\n",as[i]);
return ;
}
bzoj 4449: [Neerc2015]Distance on Triangulation的更多相关文章
- 【bzoj 4449】[Neerc2015]Distance on Triangulation
Description 给定一个凸n边形,以及它的三角剖分.再给定q个询问,每个询问是一对凸多边行上的顶点(a,b),问点a最少经过多少条边(可以是多边形上的边,也可以是剖分上的边)可以到达点b. I ...
- 【BZOJ 4449】[Neerc2015]Distance on Triangulation 多边形分治结构
这题好神啊……正解方向是分治,据我所知的分治方法有:I.离线后直接对多边形以及所有的询问进行分治 II.建立多边形的分治结构(对于三角形来说类似线段树,对于对角线来说类似平衡树),然后每次在这个分治结 ...
- BZOJ4449 : [Neerc2015]Distance on Triangulation
首先拓扑,每次取出度数为$2$的点,这样可以把所有三角形都找到. 那么建出对偶图,会发现是一棵树. 对这棵树进行点分治,每次取出重心,DFS求出所有在里面的点,然后从重心$3$个点分别做一次BFS. ...
- Gym 100851 Distance on Triangulation
题意:给你一个N边形, 然后这个n边形有n-3条边,然后询问2点之间的最短路. 题解:分治. 我们可以找到一条边,使得这幅图能分成大小相同的2幅图,那么我们就可以确定那些被分割开的询问的答案是多少了. ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- NOIP模拟赛 城市
题目描述 $ZZQ$ 是一国之主. 这个国家有$N$个城市, 第$i$个城市与第$(i + 1) (mod N)$和$(i - 1) (mod N)$在一个正$N$边形相连. $ZZQ$ 又新建了$N ...
- Week Two
2018.12.3: 1.[BZOJ 4819] 2.[BZOJ 4827] 3.[P1919] 4.[FFT模板] 2018.12.4: 1.[NTT] 2.[MTT(CRT)] 3.[MTT(my ...
- NEERC15
2015-2016 ACM-ICPC Northeastern European Regional Contest 再开一个新坑吧 目前姿势有限,C.H.I仍然处于弃坑状态 代码戳这里 Problem ...
- 【刷题】BZOJ 3365 [Usaco2004 Feb]Distance Statistics 路程统计
Description 在得知了自己农场的完整地图后(地图形式如前三题所述),约翰又有了新的问题.他提供 一个整数K(1≤K≤109),希望你输出有多少对农场之间的距离是不超过K的. Input 第1 ...
随机推荐
- [转]MVC Html.AntiForgeryToken() 防止CSRF攻击
[转]MVC Html.AntiForgeryToken() 防止CSRF攻击 本文转自:http://blog.csdn.net/luck901229/article/details/8261640 ...
- Python3.5+SQL+Prometheus+Grafana报表/监控
参考资料: pymysql 单独获取表的栏位名称 pymysql返回数据为字典形式(key:value--列:值) 行列结合,作为prometheus_client的输出. 话不多说,直接上脚本. ...
- C++中的接口继承和实现继承
很多人认为,C++中是不存在接口继承的,只有Java.C#这类语言才提供了相应的语法支持. 但是,如同鲁迅说过的某句名言:世上本没有接口继承,用的人多了,才有了接口继承.C++中依然可以实现接口继承, ...
- 会话跟踪session
会话跟踪 HTTP是“无状态”协议:客户程序每次读取Web页面,都打开到web服务器的单独的连接,而且,服务器也不自动维护客户的上下文信息.类似客户决定结账时,如何确定之前创建的购物车中哪个属于此客户 ...
- Crystal Report Error: Either the Crystal Reports registy key permission are insufficient or the Crystal Reports runtime is not installed correctly
在64位 Windows 7中水晶报表的错误: Crystal Report Error: Either the Crystal Reports registy key permission are ...
- the usage of String
经典算法:(整理汇总) 1)如何快速倒叙: public static char[] reverseArray(char[] c){ char t; for(int i=0;i<c.length ...
- poshytip漂亮的表单提示插件
一款很实用的小插件,在表单的输入框会显示提示信息,你可能会用的它. 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti ...
- "Incorrect string value: '\\xE7\\x89\\x8C\\xE5\\xB1\\x80...' for column 'name' at row 1")
出现这个错误的原因是,数据库的编码格式为latin1 而我要将utf8的中文插入到数据库中. mysql> alter database xxx default character set ut ...
- css实现垂直居中的几种方法
方法1.这个方法把一些 div 的显示方式设置为表格,因此我们可以使用表格的 vertical-align 属性. #wrapper { //代表父元素 display: table; } #cell ...
- IntelliJ IDEA使用(二):tomcat和jetty配置(转自:http://www.cnblogs.com/jenkinschan/p/6052948.html)
上一讲用idea创建了maven web项目,接下来我们把项目发布到tomcat和jetty运行,以便进一步地开发和调试 配置tomcat 第一.打开菜单栏 第二.点击设置按钮,添加应用服务器,选择t ...