12Pts ,RE求助
查看原帖
12Pts ,RE求助
495512
Grimgod楼主2023/5/12 20:59

应该是越界了,但是不知道哪里越界了。

只A了最后一个点

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int w=0,x=0;char ch;
	while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return w?-x:x;
}
vector <int > e[100005];
void add(int u,int v){
	e[u].push_back(v);
	e[v].push_back(u);
}
int n,m;
char ch,g,h;
int dep[100005],fa[100005],size[100005],son[100005],dfn[100005],rnk[100005],top[100005];
int cnt;
void dfs1(int now,int f){
	fa[now]=f,dep[now]=dep[f]+1;
	size[now]=1;
	for(int i=0;i<e[now].size();i++){
		int to=e[now][i];
		if(to==f) continue;
		dfs1(to,now);
		size[now]+=size[to];
		if(size[to]>size[son[now]]) son[now]=to;
 	}
}
void dfs2(int x,int y){
	top[x]=y;
	dfn[x]=++cnt,rnk[cnt]=x;
	if(son[x]) dfs2(son[x],y);
	for(int i=0;i<e[x].size();i++){
		int to=e[x][i];
		if(to==fa[x]||to==son[x]) continue;
		dfs2(to,to);
	}
}
struct segment_tree{
	int l,r;
	int dat;
}t[5000005];
void pushup(int p){
	t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
}
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].dat=-1;
		return ;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	pushup(p);
}
void change(int p,int x){
	if(t[p].l==t[p].r&&t[p].l==x){
		t[p].dat=x;
		return ;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(x<=mid) change(p*2,x);
	else change(p*2+1,x);
	pushup(p);
}
int query(int p,int l,int r){
	if(l<1||r>n) return 1;
	if(l>t[p].r||r<t[p].l) return 0;
	if(l<=t[p].l&&t[p].r<=r) return t[p].dat;
	int mid=(t[p].l+t[p].r)>>1;
	int val=-1;
	if(l<=mid) val=max(val,query(p*2,l,r));
	if(r>mid) val=max(val,query(p*2+1,l,r));
	return val;
}
void query_on_tree(int x){
	while(x!=1){
		if(query(1,dfn[top[x]],dfn[x])!=-1){
			cout<<rnk[query(1,dfn[top[x]],dfn[x])]<<endl;
			return ;
		}
		x=fa[top[x]];
	}
	if(x==1) cout<<1<<endl;
}
int main(){
	n=read(),m=read();
	for(int i=1;i<n;i++){
		g=read(),h=read();
		add(g,h);
	}
	dfs1(1,0);
	fa[1]=1;
	dfs2(1,1);
	build(1,1,n+1);
	change(1,1);
	/*
	for(int i=1;i<=n;i++){
		cout<<dfn[i]<<endl;
	}
	*/
	for(int i=1;i<=m;i++){
		cin>>ch,g=read();
		if(ch=='C'){
			change(1,dfn[g]);
		}
		else{
			query_on_tree(g);
		}
	}
	return 0;
}
2023/5/12 20:59
加载中...