您的位置:首页 > 其它

JZOJ.5257【NOIP2017模拟8.11】小X的佛光

2017-08-12 07:29 169 查看

Description

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define N 500001
using namespace std;
int n,m,p,t,ans,head[N*2],next[N*2],to[N*2],visit
,deep[N*2],ji[N*2],num,ti,ge
,f
[100],qwq
[100];
void add(int u,int v){
num++;
next[num]=head[u];
to[num]=v;
head[u]=num;
num++;
next[num]=head[v];
to[num]=u;
head[v]=num;
}
void shui1(){
for (int i=1,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
if ((v>=u)&&(v>=w)) printf("%d\n",v-max(u,w)+1);
else if (((v>=u)&&(v<=w))||(v<=u)&&v>=w) printf("1\n");
else if ((v<=u)&&(v<=w)) printf("%d\n",min(u,w)-v+1);
}
}
void dfs(int x,int nu,int d){
if (!visit[x]) visit[x]=++ti;
ji[ti]=x;
deep[ti]=d;
ge[x]=nu;
for (int i=head[x],v;i!=0;i=next[i]){
v=to[i];
if (!visit[v]) {
dfs(v,nu+1,d+1);
ji[++ti]=x;
deep[ti]=d;
}
}
}
void ST(){
int tmp=(int)(log(ti)/log(2));
for (int i=1;i<=ti;i++){
f[i][0]=deep[i];
qwq[i][0]=ji[i];
}
for (int j=1;j<=tmp;j++)
for (int i=1;i<=ti;i++){
int k=1<<(j-1);
if (i-k<=ti)
if (f[i][j-1]<f[i+k][j-1]){
f[i][j]=f[i][j-1];
qwq[i][j]=qwq[i][j-1];
}
else{
f[i][j]=f[i+k][j-1];
qwq[i][j]=qwq[i+k][j-1];
}
}
}
int lca(int x,int y){
int a=min(visit[x],visit[y]);
int b=max(visit[y],visit[x]);
int tmp=(int)(log((b-a)+1)/log(2));
if (f[a][tmp]<f[b-(1<<(tmp))+1][tmp])
return qwq[a][tmp];
else return qwq[b-(1<<(tmp))+1][tmp];
}
void shui2(){
for (int i=1,u,v,w,x;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
x=lca(u,v);
if (x==1) printf("%d\n",ge[u]+ge[v]-1);
else printf("%d\n",ge[u]+ge[v]-2*ge[x]+1);
}
}
void work(int a,int b,int c){
int d=0,e=0;
d=lca(a,b);
e=lca(b,c);
if (d==e){
int x=lca(a,c);
printf("%d\n",ge[x]+ge[b]-2*ge[d]+1);
}
else if ((d==b)||(e==b)) printf("1\n");
else {
int x=lca(d,e);
if (x==d) printf("%d\n",ge[b]-ge[e]+1);
else if (x==e) printf("%d\n",ge[b]-ge[d]+1);
}
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for (int i=1,u,v;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
if ((p==11)||(p==12)||(p==13)||(p==17)||(p==18)){
shui1(); return 0;
}
ti=0;
dfs(1,1,0);
ST();
if ((p==14)||(p==15)||(p==19)){
shui2(); return 0;
}
for (int i=1,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
work(u,v,w);
}
return 0;
}


水水程序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: