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; }
水水程序
相关文章推荐
- JZOJ.5258【NOIP2017模拟8.11】友好数对
- 【GDOI2017模拟8.11】生物学家
- 8.11 模拟
- 【NOIP2017提高A组模拟8.23】密码
- 【NOIP2017提高A组模拟9.7】计数题
- 【NOIP2017提高A组模拟10.10】Permutation
- JZOJ5165. 【NOIP2017模拟6.25】小W的动漫
- 【NOIP2017提高组模拟12.24】B
- 【NOIP2017提高A组模拟7.14】紧急撤离
- JZOJ 5234. 【NOIP2017模拟8.7A组】外星人的路径
- JZOJ.5264【NOIP2017模拟8.12】化学
- JZOJ.5280【NOIP2017模拟8.15】膜法师
- JZOJ.5285【NOIP2017模拟8.16】排序
- JZOJ.5287【NOIP2017模拟8.16】最短路
- 常州模拟赛d2t3 小X的佛光
- 【NOIP2017提高A组模拟8.24】提米树
- 【NOIP2017提高A组模拟10.5】Snake vs Block
- JZOJ 4911. 【NOIP2017模拟12.3】人生的叹息
- 【NOIP2017模拟12.3】子串
- NOIP2017提高组模拟赛 9 (总结)