首页 > 其他 > 详细

spoj qtree2

时间:2014-03-17 02:20:33      阅读:354      评论:0      收藏:0      [点我收藏+]

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 22000
int nn,n;
int e[maxn],ne[maxn],v[maxn],fa[maxn],w[maxn];
void add(int x,int y,int z){
ne[++nn]=e[x],e[x]=nn,v[nn]=y,w[nn]=z;
}
struct node{
int ch[2],s,val,pre,siz,rt;
}t[maxn];
#define c(x,y) t[x].ch[y]
void up(int x){
t[x].siz=t[c(x,1)].siz+t[c(x,0)].siz+1;
t[x].s=t[c(x,1)].s+t[c(x,0)].s+t[x].val;
}
void init(){
t[0].s=t[0].siz=0;
memset(e,0,sizeof(e));
memset(fa,0,sizeof(fa));
nn=0;
for(int i=1;i<=n;i++){
t[i].pre=t[i].ch[0]=t[i].ch[1]=t[i].s=t[i].val=0;
t[i].rt=t[i].siz=1;
}
}
int qu[maxn],bo,he;
void rotate(int x){
int y=t[x].pre,k=x==t[y].ch[0],z=t[y].pre;
t[y].ch[!k]=t[x].ch[k];
t[t[x].ch[k]].pre=y;
t[x].ch[k]=y;
t[y].pre=x;
t[x].pre=z;
if(!t[y].rt)t[z].ch[t[z].ch[1]==y]=x;
else t[y].rt=0,t[x].rt=1;
up(y);
}
void splay(int x){
for(;!t[x].rt;){
int y=t[x].pre,z=t[y].pre;
if(t[y].rt)rotate(x);
else if((t[z].ch[1]==y)==(t[y].ch[1]==x))rotate(y),rotate(x);
else rotate(x),rotate(x);
}
up(x);
}
int acess(int x){
int y=0;
for(;x;y=x,x=t[x].pre){
splay(x);
t[c(x,1)].rt=1;
t[c(x,1)=y].rt=0;
up(x);
}
return y;
}
int T;
int find(int x,int k){
while(t[c(x,1)].siz+1!=k){
if(t[c(x,1)].siz>=k)x=c(x,1);
else x=c(x,0),k-=(t[c(x,1)].siz+1);
}
return x;
}
int askk(int a,int b,int k){
if(k==1)return a;
acess(a);
int y=acess(b);
splay(a);
if(a==y){
if(k==t[c(a,1)].siz+1)return b;
return find(c(a,1),t[c(a,1)].siz+2-k);
}
int z=t[a].siz;
if(z+1==k)return y;
if(z>=k){
return find(a,k);
}else{
return find(c(y,1),t[c(y,1)].siz+2+z-k);
}
}
int askd(int a,int b){
acess(a);
int y=acess(b);
splay(a);
if(a==y)return t[c(y,1)].s;
return t[c(y,1)].s+t[a].s;
}
char in[10];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
init();
for(int i=1;i<n;i++){
int a,b,g;
scanf("%d%d%d",&a,&b,&g);
add(a,b,g);
add(b,a,g);
}
qu[bo=he=1]=1;
while(he>=bo){
int x=qu[bo++];
for(int i=e[x];i;i=ne[i]){
if(fa[x]==v[i])continue;
int y=v[i];
fa[y]=x;
t[y].pre=x;
t[y].val=t[y].s=w[i];
qu[++he]=y;
}
}
while(1){
scanf("%s",in);
if(in[1]==‘O‘)break;
if(in[1]==‘I‘){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",askd(a,b));
}else{
int a,b,g;
scanf("%d%d%d",&a,&b,&g);
printf("%d\n",askk(a,b,g));
}
}

}

}

spoj qtree2,布布扣,bubuko.com

spoj qtree2

原文:http://www.cnblogs.com/wangyucheng/p/3604096.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!