社区讨论
树剖TLE 50pts求条
P3459[POI 2007] MEG-Megalopolis参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7biq6p
- 此快照首次捕获于
- 2025/11/20 18:58 3 个月前
- 此快照最后确认于
- 2025/11/20 23:58 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=250005;
int n,q,x,y,tot,fa[N],dfn[N],hson[N],sz[N],top[N],dep[N],head[N],ver[N<<1],nxt[N<<1];
char op;
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-'){w = -1;} ch = getchar();}
while(ch >= '0' && ch <= '9'){s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar();}
return s * w;
}
inline void add(int x,int y){
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
inline void dfs1(int x){
sz[x]=1;
for(register int i=head[x];i;i=nxt[i]){
int y=ver[i];
fa[y]=x;
dep[y]=dep[x]+1;
dfs1(y);
sz[x]+=sz[y];
if(sz[hson[x]]<sz[y]) hson[x]=y;
}
}
inline void dfs2(int x,int tp){
dfn[x]=++tot;
top[x]=tp;
if(hson[x]==0) return;
dfs2(hson[x],x);
for(register int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(y==hson[x]) continue;
dfs2(y,y);
}
}
struct s{
int l;
int r;
int val;
}t[N<<2];
void push_up(int u){t[u].val = t[u << 1].val + t[u << 1 | 1].val;}
inline void build(int p,int l,int r){
t[p].l=l;
t[p].r=r;
if(l==r) return t[p].val=1,void();
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
}
inline void update(int p,int x){
if(t[p].l==t[p].r){
t[p].val=0;
return;
}
int mid=(t[p].l+t[p].r)>>1;
if(x<=mid) update(p*2,x);
else update(p*2+1,x);
push_up(p);
}
inline int query(int p,int l,int r){
if(l<=t[p].l&&t[p].r<=r) return t[p].val;
int mid=(t[p].l+t[p].r)>>1,ans=0;
if(l<=mid) ans+=query(p<<1,l,r);
if(r>mid) ans+=query(p<<1|1,l,r);
return ans;
}
inline int ask(int x){
int ans=0;
while(top[x]!=top[1]){
ans+=query(1,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
ans+=query(1,1,dfn[x]);
return ans;
}
int main(){
n=read();
for(register int i=1;i<n;i++){
x=read(),y=read();
add(x,y);
}
tot=0;
dfs1(1);
dfs2(1,1);
build(1,1,n);
q=read();
q+=n-1;
for(register int i=1;i<=q;i++){
op=getchar(),x=read();
if(op=='A'){
y=read();
update(1,dfn[y]);
}else printf("%lld\n",ask(x)-1);
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...