求调,悬赏一关注
查看原帖
求调,悬赏一关注
750240
Hellsing_Alucard楼主2022/12/18 08:53

50分wa2 7 8 9 10

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int n,q,b[500500],id[500500],fa[500500],dep[500500],son[500500];
int siz[500500],top[500500],cnt,a[500500];
vector<int>vec[550500];
struct node{
	int l,r,sum,tag;
}tr[500500<<2];
void dfs1(int u,int f){
	dep[u]=dep[f]+1;
	son[u]=0;siz[u]=1;
	for(auto v:vec[u]){
		if(v==f) continue;
		fa[v]=u;dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[son[u]]<siz[v])son[u]=v;
	}
}
void dfs2(int u,int tp){
	top[u]=tp;id[u]=++cnt;
	if(son[u]!=0) dfs2(son[u],tp);
	for(auto v:vec[u]){
		if(v==fa[u]||v==son[u])continue;
		dfs2(v,v);
	}
}
void push_up(int k){
	tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
}
void build(int k,int l,int r){
	tr[k].l=l;tr[k].r=r;
	if(l==r){tr[k].sum=0;return;}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	push_up(k);
}
void push_down(int k){
	tr[k<<1].tag+=tr[k].tag;
	tr[k<<1|1].tag+=tr[k].tag;
	tr[k<<1].sum+=tr[k].tag*(tr[k<<1].r-tr[k<<1].l+1);
	tr[k<<1|1].sum+=tr[k].tag*(tr[k<<1|1].r-tr[k<<1|1].l+1);
	tr[k].tag=0;
}
void add(int k,int l,int r,int v){
	if(l<=tr[k].l&&tr[k].r<=r){
		tr[k].sum+=v*(tr[k].r-tr[k].l+1);
		tr[k].tag+=v;
		return;
	}
	push_down(k);
	int mid=(tr[k].l+tr[k].r)>>1;
	if(l<=mid) add(k<<1,l,r,v);
	if(r>mid)add(k<<1|1,l,r,v);
	push_up(k);
}
void change(int x,int y,int v){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		add(1,id[top[x]],id[x],v);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	add(1,id[x],id[y],v);
}
int sum(int k,int l,int r){
	int ans=0;
	if(l<=tr[k].l&&tr[k].r<=r){
		return tr[k].sum;
	}
	push_down(k);
	int mid=(tr[k].l+tr[k].r)>>1;
	if(l<=mid)ans+=sum(k<<1,l,r);
	if(mid<r) ans+=sum(k<<1|1,l,r);
	return ans;
}
int ask(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans+=sum(1,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ans+=sum(1,id[x],id[y]);
	return ans;
}
signed main(){
  	n=read();
  	int x,y,z;
  	for(int i=1;i<n;i++){
  		x=read()+1;y=read()+1;
  		vec[x].push_back(y);
  		vec[y].push_back(x);
  	}
  	dfs1(1,0);
  	dfs2(1,1);
  	build(1,1,cnt);
  	q=read();
  	char c;
  	while(q--){
  		cin>>c;
  		if(c=='Q'){
  			x=read()+1;
  			printf("%lld\n",ask(id[x],id[x]+siz[x]-1));
  		}
  		else if(c=='A'){
  			x=read()+1;y=read()+1;z=read();
  			change(x,y,z);
  		}
  	}
    return 0;
}
```cpp
2022/12/18 08:53
加载中...