标签:ons ica cti bool -- number length follow eve
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21408 Accepted Submission(s): 8432
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 const int N=40000+10; 7 const int M=25; 8 int dp[2*N][M]; 9 bool vis[N]; 10 struct edge{ 11 int u,v,w,next; 12 }e[2*N]; 13 int tot,head[N]; 14 inline void add(int u,int v,int w,int &k){ 15 e[k].u=u;e[k].v=v;e[k].w=w; 16 e[k].next=head[u];head[u]=k++; 17 u=u^v;v=u^v;u=u^v; 18 e[k].u=u;e[k].v=v;e[k].w=w; 19 e[k].next=head[u];head[u]=k++; 20 } 21 int ver[2*N],R[2*N],first[N],dir[N]; 22 void dfs(int u,int dep){ 23 vis[u]=true;ver[++tot]=u;first[u]=tot;R[tot]=dep; 24 for(int k=head[u];k!=-1;k=e[k].next) 25 if(!vis[e[k].v]){ 26 int v=e[k].v,w=e[k].w; 27 dir[v]=dir[u]+w; 28 dfs(v,dep+1); 29 ver[++tot]=u;R[tot]=dep; 30 } 31 } 32 void ST(int n){ 33 for(int i=1;i<=n;i++) 34 dp[i][0]=i; 35 for(int j=1;(1<<j)<=n;j++){ 36 for(int i=1;i+(1<<j)-1<=n;i++){ 37 int a=dp[i][j-1],b=dp[i+(1<<(j-1))][j-1]; 38 dp[i][j]=R[a]<R[b]?a:b; 39 } 40 } 41 } 42 int RMQ(int l,int r){ 43 int k=0; 44 while((1<<(k+1))<=r-l+1)k++; 45 int a=dp[l][k],b=dp[r-(1<<k)+1][k]; 46 return R[a]<R[b]?a:b; 47 } 48 int LCA(int u,int v){ 49 int x=first[u],y=first[v]; 50 if(x>y)swap(x,y); 51 int res=RMQ(x,y); 52 return ver[res]; 53 } 54 int main(){ 55 int cas; 56 scanf("%d",&cas); 57 while(cas--){ 58 int n,q,num=0; 59 scanf("%d%d",&n,&q); 60 memset(head,-1,sizeof(head)); 61 memset(vis,false,sizeof(vis)); 62 for(int i=1;i<n;i++){ 63 int u,v,w; 64 scanf("%d%d%d",&u,&v,&w); 65 add(u,v,w,num); 66 } 67 tot=0;dir[1]=0; 68 dfs(1,1); 69 ST(2*n-1); 70 while(q--){ 71 int u,v; 72 scanf("%d%d",&u,&v); 73 int lca=LCA(u,v); 74 printf("%d\n",dir[u]+dir[v]-2*dir[lca]); 75 } 76 } 77 return 0; 78 }
HDU2586.How far away ?-LCA(在线ST算法)
标签:ons ica cti bool -- number length follow eve
原文地址:https://www.cnblogs.com/ZERO-/p/9114403.html