标签:
理解了半天。
题解:http://hzwer.com/3891.html
#include<bits/stdc++.h> #define N 50010 #define M (l+r>>1) #define P (k<<1) #define S (k<<1|1) #define K l,r,k #define L l,M,P #define R M+1,r,S #define Z int l=1,int r=n,int k=1 using namespace std; int n; struct edge{ edge* s; int v; }e[N],*back=e,*h[N]; void add(int u,int v){ h[u]=&(*back++=(edge){h[u],v}); } typedef int ds[N]; ds dp,num,p,size,son,top; void dfs1(int u){ dp[u]=dp[p[u]]+1; size[u]=1; int s=0; for(edge* i=h[u];i;i=i->s){ p[i->v]=u; dfs1(i->v); size[u]+=size[i->v]; if(s<size[i->v]) s=size[son[u]=i->v]; } } void dfs2(int u){ static int cnt; num[u]=++cnt; if(size[u]!=1){ top[son[u]]=top[u]; dfs2(son[u]); } for(edge* i=h[u];i;i=i->s) if(i->v!=son[u]) dfs2(top[i->v]=i->v); } typedef long long LL; LL a[N<<2],d[N<<2]; void apply(LL v,Z){ a[k]+=v*(r-l+1); d[k]+=v; } void devolve(Z){ if(d[k]){ apply(d[k],L); apply(d[k],R); d[k]=0; } } void A(int s,int t,Z){ if(s==l&&t==r) apply(1,K); else{ devolve(K); if(t<=M) A(s,t,L); else if(s>M) A(s,t,R); else{ A(s,M,L); A(M+1,t,R); } a[k]=a[P]+a[S]; } } LL Q(int s,int t,Z){ if(s==l&&t==r) return a[k]; devolve(K); return t<=M?Q(s,t,L) :s>M?Q(s,t,R) :Q(s,M,L)+Q(M+1,t,R); } void change(int u){ for(;u;u=p[top[u]]) A(num[top[u]],num[u]); } LL query(int u){ LL v=0; for(;u;u=p[top[u]]) v+=Q(num[top[u]],num[u]); return v; } int s[N<<1]; LL t[N<<1]; vector<int> v[N]; int main(){ int q; scanf("%d%d",&n,&q); for(int i=1;i!=n;++i){ int z; scanf("%d",&z); add(z+1,i+1); } dfs1(1); dfs2(top[1]=1); for(int i=0;i!=q;++i){ int l,r,z; scanf("%d%d%d",&l,&r,&z); ++l,++r,++z; v[l-1].push_back(i); v[r].push_back(i+q); s[i]=s[i+q]=z; } for(int i=1;i<=n;++i){ change(i); for(size_t j=0; j!=v[i].size();++j) t[v[i][j]] =query(s[v[i][j]]); } for(int i=0;i!=q;++i) printf("%lld\n", (t[i+q]-t[i])%201314); }
bzoj3626: [LNOI2014]LCA 离线+树链剖分
标签:
原文地址:http://www.cnblogs.com/f321dd/p/5496079.html