线段树92pts #11 RE 求助
查看原帖
线段树92pts #11 RE 求助
748700
IkunTeddy楼主2023/9/6 16:05

我在学校oj上交就过了,不知道为什么在nigu 就RE了,求调。

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstring>
#include <algorithm>
#define ls 2*v
#define rs 2*v+1
using namespace std;
const int maxn=1000000+10;
struct Edge{
	int v,next;
}edge[maxn];
struct node{
	int l,r,ans=0;
}tree[maxn];
int vis[maxn];
int head[maxn],tot;
void add_edge(int u,int v){
	edge[++tot].v=v;
	edge[tot].next=head[u];
	head[u]=tot;
}
int dfn[maxn],dep[maxn];
int ed[maxn];
void dfs(int u,int f){
	dfn[u]=++dfn[0];
	dep[u]=dep[f]+1;
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].v;
		if(v==f)continue;
		dfs(v,u);
	}
	ed[u]=dfn[0];
}

void build(int l,int r,int v){
	tree[v].l=l;
	tree[v].r=r;
	if(l==r){
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,ls);
	build(mid+1,r,rs);
}
void update(int x,int y,int v,int k){
	int l=tree[v].l;
	int r=tree[v].r;
	if(tree[v].ans&&dep[tree[v].ans]>dep[k])return ;
	if(x<=l&&y>=r){
		tree[v].ans=k;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)update(x,y,ls,k);
	if(y>mid)update(x,y,rs,k);
}
int ans=1;
void ask(int x,int v){
	if(tree[v].ans&&dep[tree[v].ans]>dep[ans])ans=tree[v].ans;
	int l=tree[v].l;
	int r=tree[v].r;
	if(l==r)return ;
	int mid=(l+r)>>1;
	if(x<=mid){
		ask(x,ls);
	}else{
		ask(x,rs);
	}
}
int main(){
	int n,q;
	cin>>n>>q;
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);
	}
	dep[0]=-1;
	
	dfs(1,0);
	build(1,n,1);
	getchar();
	for(int i=1;i<=q;i++){
		char c;
		int x;
		scanf("%c%d",&c,&x);
		getchar();
		if(c=='Q'){
			ans=1;
			ask(dfn[x],1);
			printf("%d\n",ans);
		}else{
			if(vis[x])continue;
			vis[x]=1;
			update(dfn[x],ed[x],1,x);
		}
	}

	return 0;
}


2023/9/6 16:05
加载中...