树剖板子

  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
原文地址:https://www.cnblogs.com/hzoi-kx/p/11379910.html