30pts玄关求调
查看原帖
30pts玄关求调
752764
GoodLeeLSR楼主2025/7/30 19:19
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
	int f=1,x=0;
	char c=getchar();
	while(!isdigit(c))
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(isdigit(c))
	{
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return f*x;
}
void write(int x) {
    if(x < 0) {
        putchar('-');
        x = -x;
    }
    if(x > 9) write(x/10);
    putchar(x%10 + '0');
}
const int N = 3e5 + 5;
const int inf = INT_MAX;
int cnt,seg[N],dfn[N],cntu,siz[N],son[N],top[N],dep[N],f[N];
int n,m;
pair<int,int> war[N];
vector<int> G[N];
void dfs1(int u,int fa)
{
	f[u] = fa;
	dep[u] = dep[fa] + 1;
	siz[u] = 1;
	for(int v : G[u])
	{
		if(v == fa) continue;
		dfs1(v,u);
		siz[u] += siz[v];
		if(!son[u] || siz[son[u]] < siz[v])
			son[u] = v;
	}
}
void dfs2(int u,int t)
{
	top[u] = t;
	dfn[u] = ++cntu;
	seg[cntu] = u;
	if(!son[u]) return;
	dfs2(son[u],t);
	for(int v : G[u])
		if(v != f[u] && v != son[u])
			dfs2(v,v);
}
int maxn[N<<2];
void up(int i)
{
	maxn[i] = max(maxn[i<<1], maxn[i<<1|1]); 
	return ;
}
void build(int l,int r,int i)
{
	if(l==r)
	{
		maxn[i] = -1;
		return;
	}
	int mid = l + r >> 1;
	build(l,mid,i<<1);
	build(mid+1,r,i<<1|1);
	up(i);
}
void update(int jobi,int v,int l,int r,int i)
{
	if(l == r)
	{
		maxn[i] = v;
		return;
	}
	int mid = l + r >> 1;
	if(mid >= jobi)
		update(jobi,v,l,mid,i<<1);
	else
		update(jobi,v,mid+1,r,i<<1|1);
	up(i);
}
int query(int jobl,int jobr,int l,int r,int i)
{
	if(jobl <= l && r <= jobr)
		return maxn[i];
	int mid = l + r >> 1,ans = -1;
	if(mid >= jobl)
		ans = max(ans,query(jobl,jobr,l,mid,i<<1));
	if(mid < jobr)
		ans = max(ans,query(jobl,jobr,mid+1,r,i<<1|1));
	return ans;
}
void r_upd(int x,int y,int v)
{
	if(dep[x] < dep[y]) swap(x,y);
	update(dfn[x],v,1,n,1);
}
int road_query(int x,int y)
{
	int ans = -1;
	if(top[x]!=top[y])
	{
		if(dep[top[x]] < dep[top[y]]) swap(x,y);
		ans = max(ans,query(dfn[top[x]],dfn[x],1,n,1));
		x = f[top[x]];
	}
	if(x == y)
		return ans;
	if(dep[x] > dep[y]) swap(x,y);
	return max(ans,query(dfn[x] + 1,dfn[y],1,n,1));
}
signed main()
{
	n = read(),m = read();
	for(int i=1;i<n;i++)
	{
		int u = read(),v = read();
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs1(1,0);
	dfs2(1,1);
	//build(1,n,1);
	while(m--)
	{
		char op;
		scanf(" %c",&op);
		if(op == 'Q')
		{
			int x = read(),y = read();
			int res = road_query(x,y);
			//cout<<res<<endl;
			if(res == inf)
				puts("No");
			else
				puts("Yes");
		}
		else if(op == 'C')
		{
			int x = read(),y = read();
			war[++cnt] = {x,y};
			r_upd(x,y,inf);
		}
		else
		{
			int x = read();
			r_upd(war[x].first,war[x].second,0);
		}
	}
	return 0;
}
2025/7/30 19:19
加载中...