在线LCA 倍增法 Codeforces Round #294 (Div. 2) E - A and B and Lecture Rooms
2015-03-02 14:05
531 查看
倍增法:/article/7167308.html
RMQ-LCA:http://dongxicheng.org/structure/lca-rmq/
题解:/article/2636232.html
RMQ-LCA:http://dongxicheng.org/structure/lca-rmq/
题解:/article/2636232.html
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<algorithm> #include<vector> #include<utility> #include<queue> #include<set> #include<map> #include<math.h> using namespace std; #define inf 0x3f3f3f3f #pragma warning(disable:4996) #pragma comment(linker, "/STACK:102400000,102400000") #define ll long long const double eps=1e-9; vector<int> f[100010]; int deep[100010]; int p[17][100010],lev; int num[100010]; void dfs(int x,int fu) { deep[x]=deep[fu]+1; num[x]=1; p[0][x]=fu; for(int i=0;i<f[x].size();i++) { int v=f[x][i]; if(v!=fu) { dfs(v,x); num[x]+=num[v]; } } } int LCA(int a,int b) { int i,j; if(deep[a]<deep[b]) swap(a,b); for(j=lev;j>=0;j--) if(deep[a]-(1<<j)>=deep[b]) a=p[j][a]; if(a==b) return a; for(j=lev;j>=0;j--) if(p[j][a]!=p[j][b]) { a=p[j][a]; b=p[j][b]; } return p[0][a]; } int get(int x,int k) { for(int i=lev;i>=0;i--) if(k>>i&1) x=p[i][x]; return x; } int main() { int n,m,i,j,k; cin>>n; for(i=0;i<=n;i++) f[i].clear(); for(i=0;i<n-1;i++) { int a,b; scanf("%d%d",&a,&b); f[a].push_back(b); f[b].push_back(a); } deep[0]=0; dfs(1,0); for(i=1;(1<<i)<n;i++) { for(j=1;j<=n;j++) p[i][j]=p[i-1][p[i-1][j]]; } lev=i-1; cin>>m; while(m--) { int a,b; scanf("%d%d",&a,&b); if(deep[a]<deep[b]) swap(a,b); int c=LCA(a,b); int tmpa=a,tmpb=b; if((deep[a]+deep[b]-2*deep[c])%2==1) { printf("0\n"); continue; } int d=(deep[a]+deep[b]-2*deep[c])/2-1; tmpa=get(tmpa,d); if(deep[a]==deep[b]) { tmpb=get(tmpb,d); printf("%d\n",n-num[tmpa]-num[tmpb]); } else printf("%d\n",num[p[0][tmpa]]-num[tmpa]); } }
相关文章推荐
- Codeforces Round #294 (Div. 2)-E. A and B and Lecture Rooms(LCA倍增)
- Codeforces Round #294 (Div. 2) A and B and Lecture Rooms(LCA 倍增)
- Codeforces Round #294 (Div. 2) E. A and B and Lecture Rooms(倍增LCA+树形DP)
- 【LCA】 Codeforces Round #294 (Div. 2) E. A and B and Lecture Rooms
- Codeforces 519E A and B and Lecture Rooms [倍增法LCA]
- LCA好(Codeforces Round #294 (Div. 2)E. A and B and Lecture Rooms)
- CF 294 div2 E. A and B and Lecture Rooms (LCA)
- [CF Round #294 div2] E. A and B and Lecture Rooms 【树上倍增】
- Codeforces Round #294 (Div. 2) E. A and B and Lecture Rooms(lca+思维,树上寻找与给定两个点距离相等的点的个数)
- Codeforces Round #294 (Div. 2)---E. A and B and Lecture Rooms
- Codeforces Round #294 (Div. 2) E. A and B and Lecture Rooms
- HDU 6065 RXD, tree and sequence(在线倍增LCA+CDQ分治+离线tarjan-LCA+dp)
- [codeforces 519E]E. A and B and Lecture Rooms(树上倍增)
- [codefoces519E]A and B and Lecture Rooms(lca)
- [CodeForces519E]A and B and Lecture Rooms(lca)
- Codeforces Round #294 (Div. 2)-E. A and B and Lecture Rooms
- HDU 5449 Robot Dog(树形DP+在线倍增LCA)
- 在线倍增法求LCA专题
- CF519E - A and B and Lecture Rooms
- POJ1330 Nearest Common Ancestors(在线倍增,离线Tarjan,最近公共祖先LCA)