20pts 玄关求调
查看原帖
20pts 玄关求调
762117
_Corange_楼主2025/7/30 15:30

AC #4#5,其他 WA

#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e6+3;
struct edge{int to,nxt;}E[N<<1];
int head[N],tot=1;
inline void add(int u,int v){
	E[++tot].nxt=head[u];
	E[head[u]=tot].to=v;
	return;
}
int fa[N],sz[N],hson[N],dep[N];
inline void dfs1(int u,int f){
	dep[u]=dep[fa[u]=f]+(sz[u]=1);
	for(int i=head[u],v;i;i=E[i].nxt){
		v=E[i].to;
		if(v==f) continue;
		dfs1(v,u);
		sz[u]+=sz[v];
		if(sz[v]>sz[hson[u]]) hson[u]=v;
	}
	return;
}
int dfn[N],idx=0,w[N],top[N],a[N],sonl[N],sonr[N];
inline void dfs2(int u,int t){
	if(!fa[u]) dfn[u]=++idx;
	top[u]=t,w[dfn[u]]=a[u];
	if(!hson[u]) return;
	dfn[hson[u]]=++idx;
	dfs2(hson[u],t);
	for(int i=head[u],v;i;i=E[i].nxt){
		v=E[i].to;
		if(v==fa[u]||v==hson[u]) continue;
		dfn[v]=++idx;
		if(!sonl[u]) sonl[u]=dfn[v];
		sonr[u]=dfn[v];
	}
	for(int i=head[u],v;i;i=E[i].nxt){
		v=E[i].to;
		if(v==fa[u]||v==hson[u]) continue;
		dfs2(v,v);
	}
	return;
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	int n;cin>>n;
	for(int i=1;i<=n;++i) cin>>a[i];
	for(int i=1,u,v;i<n;++i) cin>>u>>v,add(u,v),add(v,u);
	dfs1(1,0),dfs2(1,1);
	for(int i=1;i<=n;++i) a[i]=w[i]-w[i-1];
	int m;cin>>m;
	for(int op,x,y;m--;){
		cin>>op>>x>>y;
		if(op==1){
			a[dfn[x]]+=y,a[dfn[x]+1]-=y;
			a[dfn[hson[x]]]+=y,a[dfn[hson[x]]+sz[x]-1]-=y;
		}else{
			a[dfn[fa[x]]]+=y,a[dfn[fa[x]]+1]-=y;
			a[dfn[x]]+=y,a[dfn[x]+1]-=y;
			a[dfn[hson[x]]]+=y,a[dfn[hson[x]]+1]-=y;
			a[dfn[sonl[x]]]+=y,a[dfn[sonr[x]]+1]-=y;
		}
	}
	for(int i=1;i<=n;++i) a[i]=a[i]+a[i-1];
	int q;cin>>q;
	for(int x;q--;) cin>>x,cout<<a[dfn[x]]<<'\n';
	return 0;
}
2025/7/30 15:30
加载中...