博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spoj qtree动态树
阅读量:5230 次
发布时间:2019-06-14

本文共 2323 字,大约阅读时间需要 7 分钟。

#include<iostream>

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 21000
int nn,n;
int e[maxn],v[maxn],ne[maxn],w[maxn],fa[maxn];
void add(int x,int y,int z){
ne[++nn]=e[x],e[x]=nn,v[nn]=y,w[nn]=z;
}
struct node{
node *ch[2],*pre;
int maxx,val,rt;
}tree[maxn];
node *null;
void init(){
memset(e,0,sizeof(e));
nn=0;
null=&tree[0];
null->maxx=-0x3fffffff;
null->val=-0x3fffffff;
for(int i=1;i<=n;i++){
tree[i].pre=tree[i].ch[0]=tree[i].ch[1]=null;
tree[i].rt=1;
tree[i].maxx=0;
}
}
void up(node *x){
x->maxx=max(x->ch[0]->maxx,max(x->ch[1]->maxx,x->val));
}
void dfs(int x,int fa,int ww){
tree[x].pre=(&tree[fa]);
tree[x].val=tree[x].maxx=ww;
for(int i=e[x];i;i=ne[i])if(v[i]!=fa)dfs(v[i],x,w[i]);
}
void rotate(node *x){
node *y=x->pre,*z=y->pre;
int k=x==y->ch[0];
y->ch[!k]=x->ch[k];
x->ch[k]->pre=y;
x->ch[k]=y;
y->pre=x;
x->pre=z;
if(!y->rt)z->ch[z->ch[1]==y]=x;
else{
y->rt=0;
x->rt=1;
}
up(y);
}
void splay(node *x){
for(up(x);!x->rt;){
node *y=x->pre,*z=y->pre;
if(y->rt)rotate(x);
else if((z->ch[1]==y)==(y->ch[1]==x))rotate(y),rotate(x);
else rotate(x),rotate(x);
}
up(x);
}
node* acess(node *x){
node *y=null;
for(;x!=null;y=x,x=x->pre){
splay(x);
x->ch[1]->rt=1;
x->ch[1]=y;
y->rt=0;
up(x);
}
return y;
}
int ask(int a,int b){
acess(&tree[a]);
node *y=acess(&tree[b]);
splay(y);
if(y==(&tree[a]))return y->ch[1]->maxx;
int ma=y->ch[1]->maxx;
splay(&tree[a]);
return max(ma,tree[a].maxx);
}
void change(int a,int b){
splay(&tree[a]);
tree[a].val=b;
up(&tree[a]);
}
int cas;
char aa[10];
int main(){
cin>>cas;
while(cas--){
memset(fa,-1,sizeof(fa));
scanf("%d",&n);
init();
for(int i=1;i<n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
queue<int> jj;
jj.push(1);
tree[1].val=0;
tree[1].pre=null;
while(!jj.empty()){
int x=jj.front();
jj.pop();
for(int i=e[x];i;i=ne[i]){
if(&tree[v[i]]==tree[x].pre)continue;
tree[v[i]].pre=&tree[x];
tree[v[i]].val=tree[v[i]].maxx=w[i];
fa[v[i]]=x;
jj.push(v[i]);
}
}
while(1){
scanf("%s",aa);
if(aa[1]=='O')break;
if(aa[1]=='U'){
int a,b;
scanf("%d%d",&a,&b);
if(a==b){
printf("0\n");continue;}
printf("%d\n",ask(a,b));
}else{
int a,b;
scanf("%d%d",&a,&b);
if(fa[v[a<<1]]==v[(a<<1)-1]){
change(v[a<<1],b);
}else{
change(v[(a<<1)-1],b);
}
}
}
}
}

转载于:https://www.cnblogs.com/wangyucheng/p/3592765.html

你可能感兴趣的文章
bzoj2342
查看>>
杭电 1241 Oil Deposits
查看>>
关于java数据类型转换
查看>>
深入了解HashMap
查看>>
Python 进程共享数据(数据传输)实例
查看>>
盖茨基金会:如何使用Python拯救生命
查看>>
Android手机抓包
查看>>
Unity发热量优化
查看>>
Linux服务器安装配置Nginx服务器
查看>>
Unix/Linux 脚本中 “set -e” 的作用
查看>>
bootstrap -- col-sm-6 和 col-xs-6
查看>>
HDU 1014 Uniform Generator(题解)
查看>>
js 替换字符串 replace函数运用
查看>>
键盘按键和键盘对应代码表
查看>>
Shell入门教程:Shell函数详解
查看>>
2019.08.02【NOIP提高组】模拟 A 组 总结
查看>>
python random模块
查看>>
IOS-关闭(退)键盘事件
查看>>
重定向
查看>>
使用Web API_&_使用Pygal可视化仓库
查看>>