wa 4,5,7 玄关
查看原帖
wa 4,5,7 玄关
748744
seika27楼主2024/4/11 17:31

求调,玄关,WA 4,5,7.

#include <bits/stdc++.h>
#define cin std::cin
#define cout std::cout
const int N=5e5+5;
std::vector<int>g[N];
int fa[N],son[N],siz[N],id[N];
int w[N],wt[N],n,m;
int cnt,rt=1;
int tree[N<<2],lazy[N<<2];
#define lx (x<<1)
#define rx (x<<1|1)
#define mid (L+R>>1)
void up(int x){tree[x]=tree[lx]+tree[rx];}
void down(int x,int L,int R){if(lazy[x]){lazy[lx]+=lazy[x];lazy[rx]+=lazy[x];tree[lx]+=lazy[x]*(mid-L+1);tree[rx]+=lazy[x]*(R-mid);lazy[x]=0;}}
void build(int x,int L,int R)
{
	if(L==R){tree[x]=w[wt[L]];return;}
	build(lx,L,mid);
	build(rx,mid+1,R);
	up(x);
}
void update(int x,int L,int R,int l,int r,int k)
{
	if(l<=L&&R<=r){tree[x]+=k*(R-L+1);lazy[x]+=k;return;}
	down(x,L,R);
	if(l<=mid)update(lx,L,mid,l,r,k);
	if(r>mid)update(rx,mid+1,R,l,r,k);
	up(x);
}
int query(int x,int L,int R,int k)
{
	if(L==R)return tree[x];
	down(x,L,R);
	int ans;
	if(mid>=k)ans=query(lx,L,mid,k);
	else ans=query(rx,mid+1,R,k);
	return ans;
}
void dfs1(int x,int f)
{
	fa[x]=f;
	siz[x]=1;
	for(register int i=0;i<g[x].size();++i)
	{
		int v=g[x][i];
		if(v==f)continue;
		dfs1(v,x);
		siz[x]+=siz[v];
		if(siz[son[x]]<siz[v])son[x]=v;
	}
}
void dfs2(int x,int topf)
{
	id[x]=++cnt;
	wt[cnt]=x;
	if(!son[x])return;
	dfs2(son[x],topf);
	for(register int i=0;i<g[x].size();++i)
	{
		int v=g[x][i];
		if(v==fa[x]||v==son[x])continue;
		dfs2(v,v);
	}
}
signed main()
{
	std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m>>w[1];
	for(register int i=2;i<=n;++i)
	{
		int f;
		cin>>w[i]>>f;
		g[f].push_back(i);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	while(m--)
	{
		char c;
		int x,y;
		cin>>c>>x;
		if(c=='p')cin>>y,update(1,1,n,id[x]+1,id[x]+siz[x]-1,y);
		if(c=='u')cout<<query(1,1,n,id[x])<<'\n';
	}
}
2024/4/11 17:31
加载中...