码迷,mamicode.com
首页 > 其他好文 > 详细

第四周 9.21---9.27

时间:2015-09-22 01:19:22      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:

---------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 }
View Code

 

不知道该说什么,做完这次的网络赛

B的模拟还不懂写,G还不懂,F想一天无果

也不算想了一天,上了一天不知道什么的专业课

晚上协会讲C语言

boss也来了

想到去年这会儿在刷计算机二级的题

前年的这会儿刚滚来学校,好像军训还没有结束,,在花样队日子过得相当滋润

那会儿我们在汽车试验场训练

练几分钟,歇几分钟

虽然很晒

可是有好大的风

教官还说那是来自渭河的风-----------------------

后来我们专业学工图

憋半天憋不出一颗螺钉-------------------------------------------------

最后交作业大图通过了简直高兴得像狗一样-------

------------------------------------------------------

扯了好远了

今晚跑步居然跑了4圈---

真是像狗一样的狂奔-------------

不说了,

最后-------------------------------------------

还是惯例的加油

加油,加油,加油

 

第四周 9.21---9.27

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4827735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!