bzoj3306求助
查看原帖
bzoj3306求助
675021
Savannah_Heat楼主2022/4/27 16:11
#include <bits/stdc++.h>
using namespace std;
#define p push_back
const int N = 100000 + 5;
int n , q , in[N] , out[N] , val[N] , st[N][20] , dis[N] , vis[N] , lg[N] , t , rt = 1 , x , y;
int dfn[N];
char opt;
vector < int > g[N];
struct edge
{
	int l , r , val;
} tree[N * 4 + 5];
void bfs()
{
	queue < int > q;
	memset(dis , -1 , sizeof(dis));
	q.push(1);
	dis[1] = 1;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		for(int i = 0 ; i < g[u].size() ; ++ i )
		{
			int v = g[u][i];
			if(dis[v] == -1)
			{
				dis[v] = dis[u] + 1;
				q.push(v);
			}	
		} 
	}
}
void build(int p , int l , int r)
{
	int lc = p << 1  , rc = p << 1 | 1;
	tree[p].l = l , tree[p].r = r;
	if(l == r)
	{
		tree[p].val = val[dfn[l]];
		return ;
	}
	int mid = (l + r) >> 1;
	build(lc , l , mid);
	build(rc , mid + 1 , r);
	tree[p].val = min(tree[lc].val , tree[rc].val);
}
void adde(int p , int x , int y)
{
	int lc = p << 1 , rc = p << 1 | 1;
	if(tree[p].l == tree[p].r)
	{
		tree[p].val += y;
		return ;
	}
	int mid = (tree[p].l + tree[p].r) >> 1;
	if(x <= mid) adde(lc , x , y);
	else adde(rc , x , y);
	tree[p].val = min(tree[lc].val , tree[rc].val);
}
int ask(int p , int l , int r)
{
	int lc = p << 1 , rc = p << 1 | 1;
	if(tree[p].l >= l && tree[p].r <= r)
	{
		return tree[p].val;
	}
	int mid = (tree[p].l + tree[p].r) >> 1;
	int res = 0x3f3f3f3f;
	if(l <= mid) res = min(res , ask(lc , l , r));
	if(r > mid) res = min(res , ask(rc , l , r));
	return res; 
}
void dfs(int u , int fa)
{
	in[u] = ++t;
	dfn[t] = u;
	for(int i = 0 ; i < g[u].size() ; ++ i )
	{
		int v = g[u][i];
		if(v == fa) continue;
		dfs(v , u);
	}
	out[u] = t;	
}
void init()
{
	bfs();
	for(int i = 1 ; i < N ; ++ i ) lg[i] = lg[i >> 1] + 1;
	for(int j = 1 ; (1 << j) < N ; ++ j )
	{
		for(int i = 1 ; i <= n ; ++ i )
		{
			st[i][j] = st[st[i][j - 1]][j - 1];
		}
	}
}
int check(int x)
{
	if(dis[x] > dis[rt]) return 0;
	int t = lg[dis[x] - dis[rt]] + 1;
	int now = rt;
	for(int i = t ; i ; -- i )
	{
		if(dis[now] - (1 << i) > dis[x]) now = st[now][i];
	}
	if(st[now][0] == x) return now;
	else return 0;
}
int main()
{
	cin >> n >> q;
	for(int u = 1 ; u <= n ; ++ u )
	{
		int a , b;
		cin >> a >> b;
		st[u][0] = a;
		val[u] = b;	
		if(a)
		{
			g[a].p(u);
			g[u].p(a);
		} 
	}
	init();
	dfs(1 , 0);
	build(1 , 1 , n);
	while(q--)
	{
		cin >> opt;
		if(opt == 'V')
		{
			cin >> x >> y;
			adde(1 , x , y - val[x]);
			val[x] = y;
		}
		else if(opt == 'E')
		{
			cin >> x;
			rt = x;
		}
		else
		{
			cin >> x;
			if(x == rt)
			{
				cout << ask(1 , 1 , n) << endl;
			}
			else
			{
				int k = check(x);
				if(k) cout << min(ask(1 , 1 , in[k] - 1) , ask(1 , out[k] + 1 , n)) << endl;
				else cout << ask(1 , in[x] , out[x]) << endl;
			}
		}
	}
	return 0;
}
2022/4/27 16:11
加载中...