标签:ons mis codeforce i++ ref void end swa tor
832D - Misha, Grisha and Underground
思路:lca,求两个最短路的公共长度。公共长度公式为(d(a,b)+d(b,c)-d(a,c))/2。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define ls rt<<1,l,m #define rs rt<<1|1,m+1,r const int INF=0x3f3f3f3f; const int N=1e5+5; const int logn=20; vector<int>g[N]; int anc[logn][N]; int deep[N]; void dfs(int o,int u) { deep[u]=deep[o]+1; for(int j=0;j<g[u].size();j++) { if(g[u][j]!=o) { anc[0][g[u][j]]=u; for(int i=1;i<logn;i++)anc[i][g[u][j]]=anc[i-1][anc[i-1][g[u][j]]]; dfs(u,g[u][j]); } } } int lca(int u,int v) { if(deep[u]<deep[v])swap(u,v); for(int i=logn-1;i>=0;i--)if(deep[anc[i][u]]>=deep[v])u=anc[i][u]; if(u==v)return u; for(int i=logn-1;i>=0;i--)if(anc[i][u]!=anc[i][v])u=anc[i][u],v=anc[i][v]; return anc[0][u]; } int dis(int u,int v) { int l=lca(u,v); return deep[u]+deep[v]-2*deep[l]; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n,q; cin>>n>>q; for(int i=2;i<=n;i++) { int a; cin>>a; g[a].push_back(i); g[i].push_back(a); } for(int i=0;i<logn;i++)anc[i][1]=1; dfs(0,1); while(q--) { int a,b,c; cin>>a>>b>>c; int d1=(dis(a,b)+dis(b,c)-dis(a,c))/2+1; int d2=(dis(a,c)+dis(b,c)-dis(a,b))/2+1; int d3=(dis(a,b)+dis(a,c)-dis(b,c))/2+1; int ans=max(d1,max(d2,d3)); cout<<ans<<endl; } return 0; }
Codeforces 832D - Misha, Grisha and Underground
标签:ons mis codeforce i++ ref void end swa tor
原文地址:http://www.cnblogs.com/widsom/p/7258296.html