社区讨论

WA 80pts 求调

P3833[SHOI2012] 魔法树参与者 3已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mjo272xv
此快照首次捕获于
2025/12/27 16:49
2 个月前
此快照最后确认于
2025/12/29 21:35
2 个月前
查看原帖
思路:普普通通树链剖分+线段树模板
CPP
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define endl '\n'
struct node{
	int l,r,sum,lazy;
}tr[400010];
void push_up(int rt){
	tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}
void push_down(int rt,int l,int r){
	if(tr[rt].lazy){
		int mid=(l+r)>>1;
		int val=tr[rt].lazy;
		tr[rt<<1].lazy+=val;
		tr[rt<<1|1].lazy+=val;
		tr[rt<<1].sum+=val*(mid-l+1);
		tr[rt<<1|1].sum+=val*(r-mid);
		tr[rt].lazy=0;
	}
}
void upd(int rt,int l,int r,int L,int R,int k){
	if(L<=l&&r<=R){
		tr[rt].lazy+=k;
		tr[rt].sum+=k*(r-l+1);
		return;
	} 
	int mid=(l+r)>>1;
	push_down(rt,l,r);
	if(L<=mid)upd(rt<<1,l,mid,L,R,k);
	if(R>mid)upd(rt<<1|1,mid+1,r,L,R,k);
	push_up(rt);
}
int query(int rt,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		return tr[rt].sum;
	}
	push_down(rt,l,r);
	int mid=(l+r)>>1;
	int ans=0;
	if(L<=mid)ans+=query(rt<<1,l,mid,L,R);
	if(R>mid)ans+=query(rt<<1|1,mid+1,r,L,R);
	return ans;
}
int n;
int fa[100010]; 
vector<int>mp[100010];
int dep[100010],sz[100010],heir[100010];
//heir 是重儿子编号,继承人
void dfs(int u,int pre){
	dep[u]=dep[pre]+1;
	sz[u]=1;
	int heirid=0;
	int mx=0;
	for(int v:mp[u]){
		if(v==pre)continue;
		dfs(v,u);
		sz[u]+=sz[v];
		if(sz[v]>mx){
			mx=sz[v];
			heirid=v;
		}
	}
	heir[u]=heirid;
}
int cnt=0;
int top[100010],dfn[100010];
void dfs2(int u,int tp){
	top[u]=tp;
	dfn[u]=++cnt;
	if(heir[u]){
		dfs2(heir[u],tp);
	}
	for(int v:mp[u]){
		if(v==fa[u]||v==heir[u])continue;
		dfs2(v,v);
	}
}
void path_upd(int a,int b,int c){
	while(top[a]!=top[b]){
		if(dep[a]<dep[b])swap(a,b);
		upd(1,1,n,dfn[top[a]],dfn[a],c);
		a=fa[top[a]];
	}
	if(dep[a]>dep[b])swap(a,b);
	upd(1,1,n,dfn[a],dfn[b],c);
}
int subt_query(int u){
	return query(1,1,n,dfn[u],dfn[u]+sz[u]-1);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0); 
	cin>>n;
	for(int i=1;i<n;i++){
		int a,b;
		cin>>a>>b;
		fa[b]=a;
		mp[a].push_back(b);
		mp[b].push_back(a);
	}
	dfs(0,0);
	dfs2(0,0);
	int q;
	cin>>q;
	while(q--){
		char op;
		cin>>op;
		if(op=='A'){
			int a,b,c;
			cin>>a>>b>>c;
			path_upd(a,b,c);
		}
		else{
			int u;
			cin>>u;
			cout<<subt_query(u)<<endl;
		}
	}
	return 0;
}
目前状态:8/10 AC,最后两个点wa。
翻了一下讨论版,好像没找到和我一样80pts WA的状况的,翻了几页提交记录也没有qwq
求大佬指点

回复

8 条回复,欢迎继续交流。

正在加载回复...