RE求调
  • 板块灌水区
  • 楼主jfls211320zhr
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/5 22:49
  • 上次更新2024/10/6 09:29:00
查看原帖
RE求调
1082999
jfls211320zhr楼主2024/10/5 22:49

rt,数据范围 5050 万,求调

#include<bits/stdc++.h>
using namespace std;
vector<long long>e[500006];
long long fa[500006],dep[500006],siz[500006],son[500006],v[500006],f[500006];
void dfs(long long u,long long father){
	long long lz;
	f[u]=v[u];
	fa[u]=father;
	dep[u]=dep[father]+1;
	siz[u]=1;
	lz=e[u].size();
	for(long long i=0;i<lz;i++){
		if(e[u][i]==father)continue;
		dfs(e[u][i],u);
		siz[u]+=siz[e[u][i]];
		if(siz[son[u]]<siz[e[u][i]])son[u]=e[u][i];
		f[u]+=max(0ll,f[e[u][i]]);
	}
	return;
}
long long dfn[500006],nidfn[500006],top[500006],tot;
void pf(long long u,long long father){
	long long lz; 
	dfn[u]=++tot; 
	nidfn[tot]=u;
	if(son[u]){
		top[son[u]]=top[u];
		pf(son[u],u);
	}
	lz=e[u].size();
	for(long long i=0;i<lz;i++){
		if(e[u][i]==father)continue;
		if(e[u][i]==son[u])continue;
		top[e[u][i]]=e[u][i];
		pf(e[u][i],u);
	}
	return;
}
long long lowbit(long long x){
	return x&(-x);
}
struct st{
	long long c[500006];
	void add(long long x,long long y){
		for(long long i=x;i<=y;i+=lowbit(i))c[i]+=y;
		return;
	}
	void add(long long x,long long y,long long z){
		for(long long i=x;i<=y;i++)add(i,z);
		return; 
	}
	long long query(long long x){
		long long r=0;
		for(long long i=x;i;i-=lowbit(i))r+=c[i];
		return r;
	}
	long long query(long long x,long long y){
		return query(y)-query(x-1);
	}
}tr;
void update(long long x,long long y,long long z){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			tr.add(dfn[top[x]],dfn[x],z);
			x=fa[top[x]];
		}
		else{
			tr.add(dfn[top[y]],dfn[y],z);
			y=fa[top[y]];
		}
	}
	if(dep[x]>dep[y])tr.add(dfn[y],dfn[x],z);
	else tr.add(dfn[x],dfn[y],z);
	return; 
}
long long qry(long long x,long long y){
	long long r=0; 
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			r+=tr.query(dfn[top[x]],dfn[x]);
			x=fa[top[x]];
		}
		else{
			r+=tr.query(dfn[top[y]],dfn[y]);
			y=fa[top[y]];
		}
	}
	if(dep[x]>dep[y])r+=tr.query(dfn[y],dfn[x]);
	else r+=tr.query(dfn[x],dfn[y]);
	return r;
}
long long n,q,x,y,pre;
int main(){
	scanf("%lld %lld",&n,&q);
	for(long long i=1ll;i<=n;i++){
		scanf("%lld",&v[i]);
		tr.add(i,v[i]);
	}
	for(long long i=2ll;i<=n;i++){
		scanf("%lld",&fa[i]);
		e[fa[i]].push_back(i);
	}
	dfs(1,0);
	top[1]=1;
	pf(1,0);
	for(long long i=1;i<=q;i++){
		scanf("%lld %lld",&x,&y);
		v[x]+=y;
		tr.add(x,y);
		f[x]+=y;
		pre=x;
		for(long long ii=fa[x];ii!=0;pre=ii,ii=fa[ii]){
			if(f[pre]<=0)break;
			f[ii]+=y;
		}
		printf("%lld\n",f[x]);
	}
	return 0ll;
}
2024/10/5 22:49
加载中...