MLE50求助
查看原帖
MLE50求助
379420
Xuejiama1227楼主2023/7/25 12:01
// Problem: P6329 【模板】点分树 | 震波
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P6329
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
template<typename T>
void read(T&x){
	x=0;char c=getchar();T f=1;
	for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
	for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c&15);
	x=x*f;
}
template<typename T,typename...Args>
void read(T&x,Args&...args){read(x);read(args...);}
const int N=1e5+5;
const int INF=2e9;
struct node{
	int dep,siz,tp,dfn,fa,dfa,usz,mx,vl;
	bool vis;
	vector<int>e;
}a[N];
vector<int>c[2][N];
int n,cnt=0,rt,sum;
void dfs1(int x){
	a[x].vis=0;a[x].siz=1;
	for(auto y:a[x].e)if(y^a[x].fa){
		a[y].fa=x;
		a[y].dep=a[x].dep+1;
		dfs1(y);
		a[x].siz+=a[y].siz;
	}
}
void dfs2(int x){
	int mx=0,hs;
	a[x].dfn=++cnt;
	for(auto y:a[x].e)if(y^a[x].fa)mx=max(mx,a[y].siz);
	for(auto y:a[x].e)if(y^a[x].fa)if(a[y].siz==mx){hs=y;break;}
	if(mx){
		a[hs].tp=a[x].tp;dfs2(hs);
		for(auto y:a[x].e)if(y^a[x].fa)if(y^hs){
			a[y].tp=y;
			dfs2(y);
		}
	}
}
int lca(int x,int y){
	while(a[x].tp^a[y].tp){
		if(a[a[x].tp].dep<a[a[y].tp].dep)swap(x,y);
		x=a[a[x].tp].fa;
	}
	return (a[x].dep<a[y].dep)?x:y;
}
int get_dist(int x,int y){return a[x].dep+a[y].dep-(a[lca(x,y)].dep<<1);}
void calc_root(int x){
	a[x].usz=1;a[x].mx=0;
	for(auto y:a[x].e)if(y^a[x].fa&&!a[y].vis){
		calc_root(y);
		a[x].usz+=a[y].usz;
		a[x].mx=max(a[x].mx,a[y].usz);
	}
	a[x].mx=max(a[x].mx,sum-a[x].usz);
	if(a[x].mx<a[rt].mx)rt=x; 
}
void build(int x){
	a[x].vis=1;a[x].usz=sum+1;
	c[0][x].resize(a[x].usz+1);
	c[1][x].resize(a[x].usz+1);
	for(auto y:a[x].e)if(!a[y].vis){
		sum=a[y].usz;rt=0;a[rt].mx=INF;
		calc_root(y);
		a[rt].dfa=x;
		build(rt);
	}
}
int lowbit(int x){return x&-x;}
void modify(int op,int to,int x,int k){
	for(int i=x+1;i<=a[to].usz;i+=lowbit(i))c[op][to][i]+=k;
}
int query(int op,int to,int x){
	x=min(x+1,a[to].usz);int res=0;
	for(int i=x;i;i-=lowbit(i))res+=c[op][to][i];
	return res;
}
void work(int to,int k){
	int i;
	for(i=to;i;i=a[i].dfa)modify(0,i,get_dist(to,i),k); 
	for(i=to;a[i].dfa;i=a[i].dfa)modify(1,i,get_dist(to,a[i].dfa),k);	
}
int main(){
	int op,x,y,q,i,ans=0,dis;
	read(n,q);
	for(i=1;i<=n;i++)read(a[i].vl);
	for(i=1;i<n;i++){
		read(x,y);
		a[x].e.push_back(y);
		a[y].e.push_back(x);
	}
	a[1].dep=0;a[1].fa=0;a[1].tp=1;
	dfs1(1);dfs2(1);
	sum=n;rt=0;a[rt].mx=INF;
	calc_root(1);
	build(rt);
	for(i=1;i<=n;i++)work(i,a[i].vl);
	while(q--){
		read(op,x,y);
		x^=ans;y^=ans;
		if(op)work(x,y-a[x].vl),a[x].vl=y; 
		else{
			ans=query(0,x,y);
			for(i=x;a[i].dfa;i=a[i].dfa){
				dis=get_dist(x,a[i].dfa);  
				if(y>=dis)ans+=query(0,a[i].dfa,y-dis)-query(1,i,y-dis);  
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}
2023/7/25 12:01
加载中...