• 动态树LCT


      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<algorithm>
      5 using namespace std;
      6 const int maxn=100000+10,INF=-1u>>1;
      7 int v[maxn],maxv[maxn],minv[maxn],sumv[maxn],ch[maxn][2],pre[maxn],top[maxn],flip[maxn],n,Q;
      8 inline int read(){
      9     int x=0,sig=1;char ch=getchar();
     10     while(!isdigit(ch)){if(ch=='-') sig=-1;ch=getchar();}
     11     while(isdigit(ch)) x=10*x+ch-'0',ch=getchar();
     12     return x*=sig;
     13 }
     14 inline void write(int x){
     15     if(x==0){putchar('0');return;}if(x<0) putchar('-'),x=-x;
     16     int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;
     17     for(int i=len-1;i>=0;i--) putchar(buf[i]+'0');return;
     18 }
     19 void maintain(int o){
     20     int lc=ch[o][0],rc=ch[o][1];
     21     maxv[o]=max(maxv[lc],maxv[rc]);
     22     minv[o]=min(minv[lc],minv[rc]);
     23     sumv[o]=sumv[lc]+sumv[rc];
     24     if(v[o]){
     25         sumv[o]+=v[o];
     26         maxv[o]=max(maxv[o],v[o]);
     27         minv[o]=min(minv[o],v[o]);
     28     } return;
     29 }
     30 void pushdown(int o){
     31     if(flip[o]){
     32         flip[ch[o][0]]^=1;
     33         flip[ch[o][1]]^=1;
     34         swap(ch[o][0],ch[o][1]);
     35         flip[o]=0;
     36     } return;
     37 }
     38 void rotate(int x,int d){
     39     pushdown(x);
     40     int y=pre[x],z=pre[y];
     41     ch[y][d^1]=ch[x][d];pre[ch[x][d]]=y;
     42     ch[z][ch[z][1]==y]=x;pre[x]=z;
     43     ch[x][d]=y;pre[y]=x;
     44     maintain(y);return;
     45 }
     46 void splay(int x){
     47     int rt=x;
     48     while(pre[rt]) rt=pre[rt];
     49     if(x!=rt){
     50         top[x]=top[rt];top[rt]=0;
     51         while(pre[x]){
     52             pushdown(pre[x]);
     53             rotate(x,ch[pre[x]][0]==x);
     54         } maintain(x);
     55     } else pushdown(x);
     56     return;
     57 }
     58 void access(int x){
     59     int y=0;
     60     while(x){
     61         splay(x);
     62         top[ch[x][1]]=x;pre[ch[x][1]]=0;
     63         ch[x][1]=y;
     64         top[y]=0;pre[y]=x;
     65         maintain(x);
     66         y=x;x=top[x];
     67     } return;
     68 }
     69 void makeroot(int x){
     70     access(x);splay(x);flip[x]^=1;return;
     71 }
     72 void link(int u,int v){
     73     makeroot(u);top[u]=v;return;
     74 }
     75 void query(int x,int y){
     76     if(x==y){
     77         puts("error");return;
     78     }
     79     makeroot(x);access(y);splay(y);
     80     write(maxv[y]);putchar(' ');write(minv[y]);putchar(' ');write(sumv[y]);putchar('
    ');
     81     return;
     82 }
     83 void update(int pos,int cv){
     84     splay(pos);v[pos]=cv;
     85     maintain(pos);return;
     86 }
     87 void init(){
     88     maxv[0]=-INF;minv[0]=INF;sumv[0]=0;
     89     n=read();
     90     for(int i=1;i<n;i++){
     91         int a=read(),b=read(),c=read();
     92         v[i+n]=c;
     93         link(a,i+n);link(i+n,b);
     94     }
     95     Q=read();
     96     while(Q--)
     97     {
     98         int tp=read(),a=read(),b=read();
     99         if(tp) query(a,b);
    100         else update(a+n,b);
    101     }
    102     return ;
    103 }
    104 int main(){init();return 0;}
  • 相关阅读:
    关于分布式事务、两阶段提交协议、三阶提交协议(转)
    高并发下产生大量,随机,唯一的字符串,并输出到文件中
    地理空间距离计算优化_附近的人(转自美团技术博客)
    Web Deploy发布网站错误 检查授权和委派设置
    mssql查询所有上下级
    mssql语句递归查找所有下级
    挖洞技巧:任意账号密码重置
    MAC卸载java 12.0.2
    mac  安装brew时报错的问题及解决方式
    致远getshell
  • 原文地址:https://www.cnblogs.com/chxer/p/4456363.html
Copyright © 2020-2023  润新知