zoukankan      html  css  js  c++  java
  • 树剖板子

      1 #include<bits/stdc++.h>
      2 #define maxn 30005
      3 #define lc T[k].lch
      4 #define rc T[k].rch
      5 #define update ans=-0x7fffffff;sum=0
      6 using namespace std;
      7 struct node{
      8     int to,next;
      9 }edi[maxn*2];
     10 struct tree{
     11     int maxx,sum,l,r,lch,rch,f;
     12 }T[maxn*4];
     13 int head[maxn],d[maxn],v[maxn],f[maxn],top[maxn],dfn[maxn],rk[maxn],son[maxn],siz[maxn],ord,ans,sum=0,cnt;
     14 inline void add(int u,int v)
     15 {
     16     edi[++cnt].to=v;
     17     edi[cnt].next=head[u];
     18     head[u]=cnt;
     19     return ;
     20 }
     21 inline void up(int k)
     22 {
     23     T[k].maxx=max(T[lc].maxx,T[rc].maxx);
     24     T[k].sum=T[lc].sum+T[rc].sum;
     25     return ;
     26 }
     27 inline void down(int k)
     28 {
     29     T[lc].f+=T[k].f;
     30     T[rc].f+=T[k].f;
     31     T[lc].f+=T[k].f;
     32     T[rc].f+=T[k].f;
     33     T[lc].maxx+=T[k].f;
     34     T[rc].maxx+=T[k].f;
     35     T[lc].sum+=T[k].f*(T[lc].r-T[lc].l+1);
     36     T[rc].sum+=T[k].f*(T[rc].r-T[rc].l+1);
     37     T[k].f=T[k].f=0;
     38     return ;
     39 }
     40 void dfs1(int x,int dep)
     41 {
     42     d[x]=dep;siz[x]=1;
     43     for(int i=head[x];i;i=edi[i].next)
     44     {
     45         int k=edi[i].to;
     46         if(d[k])continue;
     47         f[k]=x;
     48         dfs1(k,dep+1);
     49         siz[x]+=siz[k];
     50         if(!son[x]||siz[son[x]]<siz[k])son[x]=k;
     51     }
     52     return ;
     53 }
     54 void dfs2(int x,int num)
     55 {
     56     top[x]=num;dfn[x]=++ord;rk[ord]=x;
     57     if(!son[x])return ;
     58     dfs2(son[x],num);
     59     for(int i=head[x];i;i=edi[i].next)
     60     {
     61         int k=edi[i].to;
     62         if(son[x]==k||dfn[k])continue;
     63         dfs2(k,k);
     64     }
     65     return ;
     66 }
     67 void build(int k,int l,int r)
     68 {
     69     if(l==r)
     70     {
     71         T[k].l=T[k].r=l;
     72         T[k].maxx=T[k].sum=v[rk[l]];
     73         return ;
     74     }
     75     T[k].l=l;T[k].r=r;
     76     T[k].lch=(k<<1);T[k].rch=(k<<1)+1;
     77     int mid=(l+r)>>1;
     78     build(lc,l,mid);
     79     build(rc,mid+1,r);
     80     up(k);
     81     return ;
     82 }
     83 void change(int k,int l,int r,int x)
     84 {
     85     if(T[k].l>=l&&T[k].r<=r)
     86     {
     87         T[k].maxx+=x;
     88         T[k].sum+=x*(T[k].r-T[k].l+1);
     89         T[k].f+=x;
     90         return ;
     91     }
     92     if(T[k].f)down(k);
     93     int mid=(T[k].l+T[k].r)>>1;
     94     if(l<=mid)change(lc,l,r,x);
     95     if(r>mid)change(rc,l,r,x);
     96     up(k);
     97 }
     98 void qurvy_max(int k,int l,int r)
     99 {
    100     if(T[k].l>=l&&T[k].r<=r)
    101     {
    102         ans=max(ans,T[k].maxx);
    103         return ;
    104     }
    105     if(T[k].f)down(k);
    106     int mid=(T[k].l+T[k].r)>>1;
    107     if(l<=mid)qurvy_max(lc,l,r);
    108     if(r>mid)qurvy_max(rc,l,r);
    109     up(k);
    110 }
    111 void qurvy_sum(int k,int l,int r)
    112 {
    113     if(T[k].l>=l&&T[k].r<=r)
    114     {
    115         sum+=T[k].sum;
    116         return ;
    117     }
    118     if(T[k].f)down(k);
    119     int mid=(T[k].l+T[k].r)>>1;
    120     if(l<=mid)qurvy_sum(lc,l,r);
    121     if(r>mid)qurvy_sum(rc,l,r);
    122     up(k);
    123 }
    124 void change2(int k,int l,int x)
    125 {
    126     if(T[k].l==T[k].r&&T[k].l==l)
    127     {
    128         T[k].maxx+=x;
    129         T[k].sum+=x*(T[k].r-T[k].l+1);
    130         return ;
    131     }
    132     if(T[k].f)down(k);
    133     int mid=(T[k].l+T[k].r)>>1;
    134     if(l<=mid)change2(lc,l,x);
    135     if(l>mid)change2(rc,l,x);
    136     up(k);
    137 }
    138 int find_max(int a,int b)
    139 {
    140     update;
    141     int fa=top[a],fb=top[b],anss=-0x7fffffff;
    142     while(fa!=fb)
    143     {
    144         if(d[fa]<d[fb])
    145         {
    146             swap(fa,fb);
    147             swap(a,b);
    148         }
    149         update;
    150         qurvy_max(1,dfn[fa],dfn[a]);
    151         anss=max(anss,ans);
    152         a=f[fa];
    153         fa=top[a];
    154     }
    155     if(dfn[a]>dfn[b])swap(a,b);
    156     update;
    157     qurvy_max(1,dfn[a],dfn[b]);
    158     anss=max(anss,ans);
    159     return anss;
    160 }
    161 int find_sum(int a,int b)
    162 {
    163     update;
    164     int fa=top[a],fb=top[b],summ=0;
    165     while(fa!=fb)
    166     {
    167         if(d[fa]<d[fb])
    168         {
    169             swap(fa,fb);
    170             swap(a,b);
    171         }
    172         update;
    173         qurvy_sum(1,dfn[fa],dfn[a]);
    174         summ+=sum;
    175         a=f[fa];
    176         fa=top[a];
    177     }
    178     if(d[a]>d[b])swap(a,b);
    179     update;
    180     qurvy_sum(1,dfn[a],dfn[b]);
    181     summ+=sum;
    182     return summ;
    183 }
    184 void change_un(int a,int b,int x)
    185 {
    186     int fa=top[a],fb=top[b];
    187     while(fa!=fb)
    188     {
    189         if(d[fa]<d[fb])
    190         {
    191             swap(fa,fb);
    192             swap(a,b);
    193         }
    194         change(1,dfn[fa],dfn[a],x);
    195         a=f[fa];
    196         fa=top[a];
    197     }
    198     if(d[a]>d[b])swap(a,b);
    199     change(1,dfn[a],dfn[b],x);
    200     return ;
    201 }
    202 inline int read()
    203 {
    204     int x=0,f=1;
    205     char c=getchar();
    206     while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
    207     while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
    208     return x*f;
    209 }
    210 int main()
    211 {
    212     int n=read(),m;
    213     for(int i=1;i<n;i++)
    214     {
    215         int u=read(),v=read();
    216         add(u,v);
    217         add(v,u);
    218     }
    219     for(int i=1;i<=n;i++)v[i]=read();
    220     dfs1(1,1);
    221     dfs2(1,1);
    222     build(1,1,n);
    223     m=read();
    224     while(m--)
    225     {
    226         string s;
    227         cin>>s;
    228         if(s=="QMAX")
    229         {
    230             int a=read(),b=read();
    231             printf("%d
    ",find_max(a,b));
    232         }
    233         else if(s=="QSUM")
    234         {
    235             int a=read(),b=read();
    236             printf("%d
    ",find_sum(a,b));
    237         }
    238         else if(s=="CHANGE")
    239         {
    240             int a=read(),b=read();
    241             change2(1,dfn[a],b-v[a]);
    242             v[a]=b;
    243         }
    244     }
    245 }
    View Code
  • 相关阅读:
    nodejs安装以及配置
    java第三周学习总结
    java第二周学习总结
    java第一周学习总结
    调查问卷
    2016.2.19 学习总结
    第一周学习总结
    第一周学习总结
    假期马原学习计划
    20145335郝昊《java程序设计》第2次实验报告
  • 原文地址:https://www.cnblogs.com/hzoi-kx/p/11379910.html
Copyright © 2011-2022 走看看