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

lct树上查询最大值和路径长

时间:2018-06-17 21:23:39      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:using   lct   show   ace   img   har   clu   can   技术分享   

技术分享图片
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define ll long long
  4 #define M 1000001
  5 struct tonod{
  6     int fa,ch[2],sum,maxx,key;
  7     bool rev,is_root;
  8 }tree[M];
  9 int gs(int x){return x==tree[tree[x].fa].ch[1];}
 10 void pushrev(int x){
 11     if(!x)return;
 12     swap(tree[x].ch[0],tree[x].ch[1]);
 13     tree[x].rev^=1;
 14 }
 15 void pushdown(int x){
 16     if(tree[x].rev){
 17         pushrev(tree[x].ch[0]);
 18         pushrev(tree[x].ch[1]);
 19         tree[x].rev=0;
 20     }
 21 }
 22 void update(int x){
 23     tree[x].maxx=tree[x].key;
 24     tree[x].sum=tree[tree[x].ch[0]].sum+tree[tree[x].ch[1]].sum+tree[x].key;
 25     if(tree[x].ch[0]){
 26         tree[x].maxx=max(tree[tree[x].ch[0]].maxx,tree[x].maxx);
 27     }
 28     if(tree[x].ch[1]) tree[x].maxx=max(tree[x].maxx,tree[tree[x].ch[1]].maxx);
 29 }
 30 void rotate(int x){
 31     if(tree[x].is_root)return;
 32     int k=gs(x),fa=tree[x].fa;
 33     int fafa=tree[fa].fa;
 34     pushdown(fa);pushdown(x);
 35     tree[fa].ch[k]=tree[x].ch[k^1];
 36     if(tree[x].ch[k^1])tree[tree[x].ch[k^1]].fa=fa;
 37     tree[x].ch[k^1]=fa;
 38     tree[fa].fa=x;
 39     tree[x].fa=fafa;
 40     if(!tree[fa].is_root)tree[fafa].ch[fa==tree[fafa].ch[1]]=x;
 41     else tree[x].is_root=1,tree[fa].is_root=0;
 42     update(fa);update(x);
 43 }
 44 void push(int x){
 45     if(!tree[x].is_root)push(tree[x].fa);
 46     pushdown(x);
 47 }
 48 void splaying(int x){
 49     push(x);
 50     for(int fa;!tree[x].is_root;rotate(x)){
 51         if(!tree[fa=tree[x].fa].is_root){
 52             rotate((gs(x)==gs(fa))?fa:x);
 53         }
 54     }
 55 }
 56 void access(int x){
 57     int y=0;
 58     do{
 59         splaying(x);
 60         tree[tree[x].ch[1]].is_root=1;
 61         tree[tree[x].ch[1]=y].is_root=0;
 62         update(x);
 63         x=tree[y=x].fa;
 64     }while(x);
 65 }
 66 void moveroot(int x){
 67     access(x);
 68     splaying(x);
 69     pushrev(x);
 70 }
 71 void link(int u,int v){
 72     moveroot(u);
 73     tree[u].fa=v;
 74 }
 75 void cut(int u,int v){
 76     moveroot(u);
 77     access(v);splaying(v);
 78     pushdown(v);
 79     tree[u].fa=tree[v].ch[0]=0;
 80     update(v);
 81 }
 82 void insert(int x,int key){
 83     tree[x].sum=tree[x].maxx=tree[x].key=key;
 84     splaying(x);update(x);
 85 }
 86 int query_max(int x,int y){
 87     moveroot(x);access(y);splaying(y);
 88     printf("%d\n",tree[y].maxx);
 89 }
 90 int query_sum(int x,int y){
 91     moveroot(x);access(y);splaying(y);
 92     printf("%d\n",tree[y].sum);
 93 }
 94 int main(){
 95     int n;
 96     scanf("%d",&n);
 97     for(int i=1;i<=n;i++)
 98     tree[i].is_root=1;
 99     for(int i=1,a,b;i<n;i++)
100     scanf("%d%d",&a,&b),link(a,b);
101     for(int i=1,a;i<=n;i++)
102     scanf("%d",&a),insert(i,a);
103     int m;
104     scanf("%d",&m);
105     while(m--){
106         char tp[10];
107         scanf("%s",tp);
108         if(tp[0]==C){
109             int x,y;
110             scanf("%d%d",&x,&y);
111             insert(x,y);
112         }
113         else if(tp[1]==M){
114             int x,y;
115             scanf("%d%d",&x,&y);
116             query_max(x,y);
117         }else{
118             int x,y;
119             scanf("%d%d",&x,&y);
120             query_sum(x,y);
121         }
122     }
123 }
hh

 

lct树上查询最大值和路径长

标签:using   lct   show   ace   img   har   clu   can   技术分享   

原文地址:https://www.cnblogs.com/mzh2017/p/9193681.html

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