树链剖分73pts,#8,9,10 TLE 求助
查看原帖
树链剖分73pts,#8,9,10 TLE 求助
177070
暗ざ之殇楼主2020/9/17 17:29
#include<iostream>
#include<cstdio>
using namespace std;
int read()
{
	int a=0,x=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') x=-x;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		a=(a<<1)+(a<<3)+(ch^48);
		ch=getchar();
	}
	return a*x;
}
const int N=2e5;
int n,m,tim,Edge;
int head[N],top[N],dep[N],size[N],son[N],dfn[N],last[N],Id[N],lazy[N<<2],Max[N<<2];
char opt[5];
struct node
{
	int to,nxt;
}a[N<<1];
void add(int from,int to)
{
	Edge++;
	a[Edge].to=to;
	a[Edge].nxt=head[from];
	head[from]=Edge;
}
void dfs1(int u,int fa)
{
	dep[u]=dep[fa]+1;
	size[u]=1;
	for(int i=head[u];i;i=a[i].nxt)
	{
		int v=a[i].to;
		if(v==fa) continue;
		dfs1(v,u);
		size[u]+=size[v];
		if(size[v]>size[son[u]]) son[u]=v;
	}
}
void dfs2(int u,int fa)
{
	if(u==0) return ;
	dfn[u]=last[u]=++tim;
	Id[tim]=u;
	if(u==son[fa]) top[u]=top[fa];
	else top[u]=u;
	dfs2(son[u],u);
	for(int i=head[u];i;i=a[i].nxt)
	{
		int v=a[i].to;
		if(v==fa||v==son[u]) continue;
		dfs2(v,u);
	}
	last[u]=tim;
}
void pushdown(int node,int l,int r)
{
	if(lazy[node]==0) return ;
	lazy[node<<1]=max(lazy[node<<1],lazy[node]);
	lazy[node<<1|1]=max(lazy[node<<1|1],lazy[node]);
	Max[node<<1]=max(Max[node<<1],lazy[node]);
	Max[node<<1|1]=max(Max[node<<1|1],lazy[node]);
	lazy[node]=0;
}
void update(int node)
{
	Max[node]=max(Max[node<<1],Max[node<<1|1]);
}
void insert(int node,int l,int r,int x,int y,int k)
{
	if(x<=l&&r<=y) 
	{
		if(k>=Max[node])
		{
			lazy[node]=k;
			Max[node]=k;
			return ;
		}	
        if(l==r) return ;
	}
	pushdown(node,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) insert(node<<1,l,mid,x,y,k);
	if(y>mid) insert(node<<1|1,mid+1,r,x,y,k);
	update(node);
}
int query(int node,int l,int r,int x)
{
	if(l==r) return Max[node];
	pushdown(node,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) return query(node<<1,l,mid,x);
	else return query(node<<1|1,mid+1,r,x);
}
int main()
{
	n=read();m=read();
	for(int i=1;i<n;i++)
	{
		int u=read();
		int v=read();
		add(u,v);add(v,u);
	}
	dfs1(1,0);dfs2(1,0);
	insert(1,1,n,1,n,1);
	for(int i=1;i<=m;i++)
	{
		cin>>opt;
		int u=read();
		if(opt[0]=='C') insert(1,1,n,dfn[u],last[u],dfn[u]);
		else printf("%d\n",Id[query(1,1,n,dfn[u])]);
	}
	return 0;
}

开 O2 也救不了

2020/9/17 17:29
加载中...