社区讨论
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 条回复,欢迎继续交流。
正在加载回复...