WA 50pts
查看原帖
WA 50pts
794701
wo_hen_la楼主2024/2/23 13:00

求调

#include <bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
int n,m;	
int head[N],cnt;
int dep[N],siz[N],fa[N],cson[N];//dfs1
int w[N],id[N],topl[N],ti;//dfs2
struct Edge
{
	int to,nex;
}e[N<<1];
struct Tree
{
	int num,l,r,lz;
}tr[N<<2];
void up(int k){ tr[k].num=tr[k<<1].num+tr[k<<1|1].num; }
void down(int k)
{
	tr[k<<1].lz+=tr[k].lz;
	tr[k<<1|1].lz+=tr[k].lz;
	tr[k<<1].num+=(tr[k<<1].r-tr[k<<1].l+1)*tr[k].lz;
	tr[k<<1|1].num+=(tr[k<<1|1].r-tr[k<<1|1].l+1)*tr[k].lz;
	tr[k].lz=0;
}
void build(int k,int ll,int rr)
{
	tr[k]={0,ll,rr,0};
	if(ll==rr) return;
	int mid=ll+rr>>1;
	build(k<<1,ll,mid);
	build(k<<1|1,mid+1,rr);
	up(k);
}
void modify(int k,int ll,int rr,int val)
{
	if(tr[k].l>=ll && tr[k].r<=rr){
		tr[k].num+=(tr[k].r-tr[k].l+1)*val;
		tr[k].lz+=val;
		return;
	}
	if(tr[k].lz) down(k);
	if(tr[k<<1].r>=ll) modify(k<<1,ll,rr,val);
	if(tr[k<<1|1].l<=rr) modify(k<<1|1,ll,rr,val);
	up(k);
}
int query(int k,int ll,int rr)
{
	if(tr[k].l>=ll && tr[k].r<=rr) return tr[k].num;
	if(tr[k].lz) down(k);
	int cnt=0;
	if(tr[k<<1].r>=ll) cnt+=query(k<<1,ll,rr);
	if(tr[k<<1|1].l<=rr) cnt+=query(k<<1|1,ll,rr);
	return cnt;
}

void add(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].nex=head[u];
	head[u]=cnt;	
}

void dfs1(int u,int dad)
{
	dep[u]=dep[dad]+1;fa[u]=dad;siz[u]=1;
	int mx=0;
	for(int i=head[u];i;i=e[i].nex){
		int v=e[i].to;
		if(v==dad) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>mx) mx=siz[v],cson[u]=v;
	}
}
void dfs2(int u,int topu)
{
	id[u]=++ti;w[ti]=0;topl[u]=topu;
	if(!cson[u]) return;
	dfs2(cson[u],topu);
	for(int i=head[u];i;i=e[i].nex){
		int v=e[i].to;
		if(v!=fa[u] && v!=cson[u]) dfs2(v,v);
	}
}

void op1(int x,int y,int z)
{
	while(topl[x]!=topl[y]){
		if(dep[topl[x]]<dep[topl[y]]) swap(x,y);
		modify(1,id[topl[x]],id[x],z);
		x=fa[topl[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	modify(1,id[x],id[y],z);
}
main()
{
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		u++,v++;
		add(u,v);add(v,u);
	}
	dfs1(1,0);dfs2(1,1);
	build(1,1,n);
	cin>>m;
	while(m--){
		char op;
		int u,v,d;
		cin>>op;
		if(op=='A'){
			cin>>u>>v>>d;u++,v++;
			op1(u,v,d);
		}
		if(op=='Q'){
			cin>>u;u++;
			cout<<query(1,u,id[u]+siz[u]-1)<<"\n";
		}
	}
	return 0;
}
2024/2/23 13:00
加载中...