码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj3626: [LNOI2014]LCA 离线+树链剖分

时间:2016-05-15 21:21:08      阅读:366      评论:0      收藏:0      [点我收藏+]

标签:

理解了半天。

题解: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!