社区讨论
线段树51pts,求条
P3459[POI 2007] MEG-Megalopolis参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m2ejvdug
- 此快照首次捕获于
- 2024/10/18 17:51 去年
- 此快照最后确认于
- 2025/11/04 16:55 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=3e5;
int n,m,tot,head[N],dfn[N],T,t[N<<2],a[N]={-1},sz[N],laz[N];
struct qp{
int to,ne;
}e[N<<1];
void add(int u,int v){
e[++tot]={v,head[u]};
head[u]=tot;
}
void dfs(int u,int f){
dfn[u]=++T;
a[dfn[u]]=a[dfn[f]]+1;
sz[dfn[u]]=1;
for(int i=head[u];i;i=e[i].ne){
int v=e[i].to;
if(v==f) continue;
dfs(v,u);
sz[dfn[u]]+=sz[dfn[v]];
}
}
void ln(int rt,int l,int r){
int mid=l+r>>1;
laz[rt<<1]+=laz[rt],laz[rt<<1|1]+=laz[rt];
t[rt<<1]-=(mid-l+1)*laz[rt];
t[rt<<1|1]-=(r-mid)*laz[rt];
t[rt]=t[rt<<1]+t[rt<<1|1];
laz[rt]=0;
}
void build(int rt,int l,int r){
if(l==r){
t[rt]=a[l];
return ;
}
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
t[rt]=t[rt<<1]+t[rt<<1|1];
}
void xg(int rt,int l,int r,int fl,int fr){
if(fl<=l && r<=fr){
laz[rt]++;
t[rt]-=(r-l+1);
return ;
}
if(laz[rt]) ln(rt,l,r);
int mid=l+r>>1;
if(fl<=mid) xg(rt<<1,l,mid,fl,fr);
if(mid<fr) xg(rt<<1|1,mid+1,r,fl,fr);
t[rt]=t[rt<<1]+t[rt<<1|1];
}
int fd(int rt,int l,int r,int f){
if(l==r) return t[rt];
if(laz[rt]) ln(rt,l,r);
int mid=l+r>>1;
if(f<=mid) return fd(rt<<1,l,mid,f);
else return fd(rt<<1|1,mid+1,r,f);
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
build(1,1,n);
// for(int i=1;i<=n;i++)
// cout<<i<<":"<<a[dfn[i]]<<" "<<sz[i]<<endl;
cin>>m;
for(int i=1;i<=n+m-1;i++){
char op;
int x,y;
cin>>op>>x;
x=dfn[x];
if(op=='A'){
cin>>y;
y=dfn[y];
if(y>x) swap(x,y);
xg(1,1,n,x,x+sz[x]-1);
}
else cout<<fd(1,1,n,x)<<endl;
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...