求助
查看原帖
求助
120855
清雅流水楼主2021/5/13 20:24
#include <bits/stdc++.h>
using namespace std ;
int n , q ;
bool ybj[100010] ;
bool yy[400010] ;
int lt[100010] , dy[100010] , yt , hd[100010] ;
int size[100010] , fa[100010] ;
int fir[100010] , nxt[200010] , zx[200010] , bs ;
int dfs( int wz )
{
	size[wz] = 1 ;
	for( int i = fir[wz] ; i != -1 ; i = nxt[i] )
	{
		if( zx[i] != fa[wz] )
		{
			fa[zx[i]] = wz ;
			size[wz] += dfs( zx[i] ) ;
		}
	}
	return size[wz] ;
}
void dfs2( int wz )
{
	dy[wz] = yt ;
	hd[yt] = wz ;
	yt ++ ;
	if( nxt[fir[wz]] == -1 && fa[wz] != -1 ) return ;
	int maxx = zx[fir[wz]] ;
	if( maxx == fa[wz] ) maxx = zx[nxt[fir[wz]]] ;
	for( int i = fir[wz] ; i != -1 ; i = nxt[i] )
	{
		if( zx[i] != fa[wz] )
		{
			if( size[zx[i]] > size[maxx] )
			{
				maxx = zx[i] ;
			}
		}
	}
	lt[maxx] = lt[wz] ;
	dfs2( maxx ) ;
	for( int i = fir[wz] ; i != -1 ; i = nxt[i] )
	{
		if( zx[i] != fa[wz] && zx[i] != maxx )
		{
			lt[zx[i]] = zx[i] ;
			dfs2( zx[i] ) ;
		}
	}
	return ;
}
void xg( int wz , int l , int r , int mb )
{
	if( l > mb || r < mb ) return ;
	if( l == r )
	{
		yy[wz] = 1 ;
		return ;
	}
	int mid = ( l + r ) / 2 ;
	xg( wz * 2 , l , mid , mb ) ;
	xg( wz * 2 + 1 , mid + 1 , r , mb ) ;
	yy[wz] = 1 ;
	return ;
}
bool cx( int wz , int l , int r , int ll , int rr )
{
	if( rr < l || r < ll ) return false ;
	if( ll <= l && r <= rr )
	{
		return yy[wz] ;
	}
	int mid = ( l + r ) / 2 ;
	return cx( wz * 2 , l , mid , ll , rr ) || cx( wz * 2 + 1 , mid + 1 , r , ll , rr ) ;
}
int cz( int ww )
{
	while( !cx( 1 , 0 , n - 1 , dy[lt[ww]] , dy[ww] ) )
	{
		ww = fa[lt[ww]] ;
	}
	int l = dy[lt[ww]] , r = dy[ww] , ans = dy[lt[ww]] , mid ;
	while( l <= r )
	{
		mid = ( l + r ) / 2 ;
		if( cx( 1 , 0 , n - 1 , mid , ww ) )
		{
			ans = mid ;
			l = mid + 1 ;
		}
		else
		{
			r = mid - 1 ;
		}
	}
	return hd[ans] ;
}
int main ()
{
	memset( fir , -1 , sizeof(fir) ) ;
	scanf( "%d%d\n" , &n , &q ) ;
	int t1 , t2 ;
	char tt ;
	for( int i = 1 ; i < n ; i ++ )
	{
		scanf( "%d%d" , &t1 , &t2 ) ;
		t1 -- ;
		t2 -- ;
		nxt[bs] = fir[t1] ;
		fir[t1] = bs ;
		zx[bs] = t2 ;
		bs ++ ;
		nxt[bs] = fir[t2] ;
		fir[t2] = bs ;
		zx[bs] = t1 ;
		bs ++ ;
	}
	fa[0] = -1 ;
	dfs( 0 ) ;
	lt[0] = 0 ;
	dfs2( 0 ) ;
	xg( 1 , 0 , n - 1 , 0 ) ;
	scanf( "\n" ) ;
	for( int i = 0 ; i < q ; i ++ )
	{
		scanf( "%c %d" , &tt , &t1 ) ;
		t1 -- ;
		if( tt == 'C' )
		{
			xg( 1 , 0 , n - 1 , dy[t1] ) ;
		}
		else
		{
			printf( "%d\n" , cz( t1 ) + 1 ) ;
		}
		scanf( "\n" ) ;
	}
	return 0 ;
}

luogu 20pts

前两个dfs是书剖,中间两个函数是线段树,最后一函数个是二分

错误的点都比较偏后,平均是100个询问里有一个WA,偏大偏小不确定

2021/5/13 20:24
加载中...