标签:
---------9.21
cf 519 e
http://codeforces.com/problemset/problem/519/E
补了之前说的要滚去学的lca
有4种情况
1. u 是lca,v是lca,这种不合法
2. u 是lca,v不是lca,这种要找他们的中点是不是存在
3. u 不是lca,v是lca,和第二种一样
4. u不是lca,v不是lca ;再分两种情况,u,v到lca的距离不等,u,v到lca的距离相等
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 8 const int INF = (1<<30)-1; 9 const int maxn = 400005; 10 const int MAX_LOG = 20; 11 12 int n,m; 13 int first[maxn],ecnt; 14 int fa[MAX_LOG][maxn],dep[maxn]; 15 int dp[maxn],vis[maxn]; 16 int sz[maxn]; 17 18 struct Edge{ 19 int u,v,next,w; 20 }; 21 22 Edge e[10*maxn],ea[10*maxn]; 23 24 void init(){ 25 ecnt = 0; 26 memset(first,-1,sizeof(first)); 27 } 28 29 void Add_edge(int u,int v){ 30 e[ecnt].u = u; 31 e[ecnt].v = v; 32 e[ecnt].next = first[u]; 33 first[u] = ecnt++; 34 } 35 36 void Dfs(int p,int pre,int d){ 37 fa[0][p] = pre; 38 dep[p] = d; 39 sz[p] = 1; 40 for(int i = first[p];~i;i = e[i].next){ 41 int v = e[i].v; 42 if(v == pre) continue; 43 Dfs(v,p,d+1); 44 sz[p] += sz[v]; 45 } 46 } 47 48 void Pre(){ 49 Dfs(1,-1,0); 50 for(int k = 0;k+1 < MAX_LOG;++k){ 51 for(int v = 1;v <= n;v++){ 52 if(fa[k][v] < 0) fa[k+1][v] = -1; 53 else fa[k+1][v] = fa[k][fa[k][v]]; 54 } 55 } 56 } 57 58 int Lca(int u,int v){ 59 if(dep[u] > dep[v]) swap(u,v); 60 for(int k = MAX_LOG-1;k >= 0;--k){ 61 if(dep[v]-dep[u] & (1<<k)) 62 v = fa[k][v]; 63 } 64 if(u == v) return u; 65 for(int k = MAX_LOG-1;k >= 0;--k){ 66 if(fa[k][u] != fa[k][v]){ 67 u = fa[k][u]; 68 v = fa[k][v]; 69 } 70 } 71 return fa[0][u]; 72 } 73 74 int Up(int d,int u){ 75 for(int k = MAX_LOG-1;k >= 0;k--){ 76 if(d & (1<<k)) u = fa[k][u]; 77 } 78 return u; 79 } 80 81 void solve(int u,int v){ 82 if(u == v){ 83 printf("%d\n",n); 84 return; 85 } 86 int lca = Lca(u,v); 87 //printf("u = %d v = %d lca = %d\n",u,v,lca); 88 89 int l = dep[u] + dep[v]-2*dep[lca]; 90 if(l%2){ 91 printf("0\n"); 92 return; 93 } 94 95 if((u == lca && v != lca) || (u != lca && v == lca)){ 96 int x = 0; 97 if(u == lca) x = v; 98 else x = u; 99 100 int y = Up(l/2,x); 101 int z = Up(l/2-1,x); 102 // printf("x = %d y = %d lca = %d\n",x,y,lca); 103 int res = sz[y]-sz[z]; 104 printf("%d\n",res); 105 } 106 107 if(u != lca && v != lca){ 108 int l = dep[u] - dep[lca]; 109 int r = dep[v] - dep[lca]; 110 // printf("u = %d v = %d l = %d r = %d\n",u,v,l,r); 111 if(l == r){ 112 int y = Up(l-1,u); 113 int z = Up(r-1,v); 114 // printf("===l = %d r = %d y = %d z = %d\n",l,r,y,z); 115 int res = n-sz[y]-sz[z]; 116 printf("%d\n",res); 117 } 118 else{ 119 if(dep[u] > dep[v]) swap(u,v); 120 int x = v; 121 int y = Up((l+r)/2,x); 122 int z = Up((l+r)/2-1,x); 123 // printf("---x = %d y = %d z = %d\n",x,y,z); 124 int res = sz[y]-sz[z]; 125 printf("%d\n",res); 126 } 127 } 128 } 129 130 int main(){ 131 while(scanf("%d",&n) != EOF){ 132 init(); 133 for(int i = 1;i <= n-1;i++){ 134 int u,v; 135 scanf("%d %d",&u,&v); 136 Add_edge(u,v); 137 Add_edge(v,u); 138 } 139 memset(sz,0,sizeof(sz)); 140 Pre(); 141 scanf("%d",&m); 142 for(int i = 1;i <= m;i++){ 143 int u,v; 144 scanf("%d %d",&u,&v); 145 solve(u,v); 146 } 147 } 148 return 0; 149 }
不知道该说什么,做完这次的网络赛
B的模拟还不懂写,G还不懂,F想一天无果
也不算想了一天,上了一天不知道什么的专业课
晚上协会讲C语言
boss也来了
想到去年这会儿在刷计算机二级的题
前年的这会儿刚滚来学校,好像军训还没有结束,,在花样队日子过得相当滋润
那会儿我们在汽车试验场训练
练几分钟,歇几分钟
虽然很晒
可是有好大的风
教官还说那是来自渭河的风-----------------------
后来我们专业学工图
憋半天憋不出一颗螺钉-------------------------------------------------
最后交作业大图通过了简直高兴得像狗一样-------
------------------------------------------------------
扯了好远了
今晚跑步居然跑了4圈---
真是像狗一样的狂奔-------------
不说了,
最后-------------------------------------------
还是惯例的加油
加油,加油,加油
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4827735.html