社区讨论

树剖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 条回复,欢迎继续交流。

正在加载回复...