社区讨论
0pts WA+TLE求条
P3833[SHOI2012] 魔法树参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjsp4ua
- 此快照首次捕获于
- 2025/11/04 07:52 4 个月前
- 此快照最后确认于
- 2025/11/04 07:52 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=1e5+5;
int n,q,dfncnt;
int fa[N],dep[N],sz[N],dfn[N],hson[N],top[N];
vector<int>g[N];
struct SGT{
#define ls i<<1
#define rs i<<1|1
struct node{
int l,r,sum,tag;
}t[N<<2];
inline void addtag(int i,int x){
t[i].tag+=x;
t[i].sum+=(t[i].r-t[i].l+1)*x;
}
inline void pushup(int i){
t[i].sum=t[ls].sum+t[rs].sum;
}
inline void pushdown(int i){
if(t[i].tag){
addtag(ls,t[i].tag);
addtag(rs,t[i].tag);
}
}
void build(int i,int l,int r){
t[i]={l,r,0,0};
if(l==r) return;
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void update(int i,int l,int r,int x){
if(l<=t[i].l&&t[i].r<=r){
addtag(i,x);
return;
}
pushdown(i);
int mid=t[i].l+t[i].r>>1;
if(l<=mid) update(ls,l,r,x);
if(r>=mid+1) update(rs,l,r,x);
pushup(i);
}
int query(int i,int l,int r){
if(l<=t[i].l&&t[i].r<=r) return t[i].sum;
pushdown(i);
int mid=t[i].l+t[i].r>>1,ans=0;
if(l<=mid) ans=query(ls,l,r);
if(r>=mid+1) ans+=query(rs,l,r);
return ans;
}
}sgt;
void dfs1(int u,int f){
dep[u]=dep[f]+1;
sz[u]=1;
for(int v:g[u]){
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[hson[u]]) hson[u]=v;
}
}
void dfs2(int u,int tp){
top[u]=tp;
dfn[u]=++dfncnt;
if(hson[u]) dfs2(hson[u],tp);
for(int v:g[u]){
if(v==hson[u]) continue;
dfs2(v,v);
}
}
void update(int u,int v,int x){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
sgt.update(1,dfn[top[u]],dfn[u],x);
x=fa[top[x]];
}
if(dep[u]>dep[v]) swap(u,v);
sgt.update(1,dfn[u],dfn[v],x);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
rep(i,1,n-1){
int u,v;
cin>>u>>v;
u++,v++;
g[u].push_back(v);
fa[v]=u;
}
dfs1(1,0);dfs2(1,1);
sgt.build(1,1,n);
cin>>q;
while(q--){
char op;
cin>>op;
if(op=='A'){
int u,v,d;
cin>>u>>v>>d;
u++,v++;
update(u,v,d);
}else{
int u;cin>>u;u++;
cout<<sgt.query(1,dfn[u],dfn[u]+sz[u]-1)<<'\n';
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...