pits = = First bare tree profile
#include <cstdio>#include<algorithm>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>using namespacestd;Const intmaxn=30010, maxm=30010, inf=~0u>>1;intN;structdata{intSum,max; Data (intsum=0,intmax=-INF): Sum (sum), Max (max) {} Dataoperator+ (Constdata& RHS)Const{ returnData (sum+Rhs.sum,std::max (Max,rhs.max)); }};structsegmenttree{Data DA[MAXN*4]; intlft,rgt,w; voidppintLintR=0) {LfT=l;rgt=R; } voidChangeintSintLintR) { if(L==r && l==lft) {Da[s]=Data (W,W); return; } intMid= (l+r) >>1; if(lft<=mid) Change (s<<1, L,mid); ElseChange (s<<1|1, mid+1, R); Da[s]=da[s<<1]+da[s<<1|1]; } Data Query (intSintLintR) { if(Lft<=l && R<=RGT)returnDa[s]; intMid= (l+r) >>1; if(Rgt<=mid)returnQuery (s<<1, L,mid); if(MID<LFT)returnQuery (s<<1|1, mid+1, R); returnQuery (s<<1, L,mid) + query (s<<1|1, mid+1, R); }}seg;inten[maxm*2],next[maxm*2],fir[maxn],tot;voidADD (int from,intTo ) {en[++tot] =to ; Next[tot]= fir[ from]; fir[ from] =tot;}intSZ[MAXN],FA[MAXN],SON[MAXN],DEP[MAXN];voidDfsintu) {Sz[u]=1; Son[u]=0; for(intk=fir[u];k;k=Next[k]) { intv=En[k]; if(v = = Fa[u])Continue; FA[V]=u; DEP[V]=dep[u]+1; DFS (v); Sz[u]+=Sz[v]; if(Sz[v]>sz[son[u]]) son[u] =v; }}intPos[maxn],top[maxn],tm;voidBuildintUintpre) {Top[u]=Pre; Pos[u]=++TM; if(Son[u]) build (Son[u],pre); for(intk=fir[u];k;k=Next[k]) { intv=En[k]; if(V==fa[u] | | v==son[u])Continue; Build (V,V); }}data Query (intAintb) { intta=top[a],tb=Top[b]; DATA ret; for(; ta!=tb;a=fa[ta],ta=Top[a]) { if(dep[ta]<DEP[TB]) swap (A, b), swap (TA,TB); SEG.PP (Pos[ta],pos[a]); RET=ret+seg.query (1,1, N); } if(dep[a]>dep[b]) swap (A, b); SEG.PP (Pos[a],pos[b]); returnRet+seg.query (1,1, n);} intMain () {#ifdef DEBUG freopen ("In.txt","R", stdin); Freopen ("My.out","W", stdout);#endifscanf ("%d",&N); for(intI=1; i<n;i++){ intu,v; scanf ("%d%d",&u,&v); ADD (U,V); ADD (V,u); } DFS (1); Build (1,1); for(intI=1; i<=n;i++) {seg.pp (pos[i]); scanf ("%d",&SEG.W); Seg.change (1,1, N); } intm; scanf ("%d",&m); Charcmd[Ten]; intb; for(; m--;) {scanf ("%s%d%d",cmd,&a,&b); if(cmd[0]=='C') Seg.lft=pos[a],seg.w=b,seg.change (1,1, N); Else if(cmd[1]=='S') printf ("%d\n", query (b). sum); Elseprintf"%d\n", query (A, b). Max); } return 0;}
Statistics of bzoj3931 zjoi2008 tree count