树剖第一个点TLE
  • 板块P4116 Qtree3
  • 楼主char_cha_ch
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/12/9 14:09
  • 上次更新2023/10/27 00:03:09
查看原帖
树剖第一个点TLE
701221
char_cha_ch楼主2022/12/9 14:09
#include<cstdio>
#define N 100009

inline int read()
{
	register int ret = 0;
	register bool f = 1;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		(ch == '-') ? f = 0 : 0, ch = getchar();
	while (ch >= '0' && ch <= '9')
		ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
	return f ? ret : -ret;
}

int fa[N], top[N], dep[N], siz[N], dfn[N], whe[N], tot, hson[N];

struct node
{
	int v, nxt;
}e[N << 1];

int head[N], cnt;

inline void add(int u, int v)
{
	e[++ cnt].v = v, e[cnt].nxt = head[u], head[u] = cnt;
}

void dfs1(register int u, register int fath = 0)
{
	fa[u] = fath;
	dep[u] = dep[fath] + 1;
	siz[u] = 1;
	register int v, i;
	for (i = head[u];i;i = e[i].nxt)
	{
		v = e[i].v;
		if (v != fath)
		{
			dfs1(v, u);
			siz[u] += siz[v];
			if (siz[v] > siz[hson[u]])
				hson[u] = v;
		}
	}
}

void dfs2(register int u, register int topf)
{
	top[u] = topf;
	dfn[u] = ++ tot;
	whe[tot] = u;
	if (!hson[u])
		return;
	dfs2(hson[u], topf);
	register int i, v;
	for (i = head[u];i;i = e[i].nxt)
	{
		v = e[i].v;
		if (v != fa[u] && v != hson[u])
			dfs2(v, v);
	}
}

int tr[N << 2];

#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)

void build(register int l, register int r, register int p = 1)
{
	tr[p] = 1e9;
	if (l == r)
		return;
	register int mid = (l + r) >> 1;
	build(l, mid, p << 1);
	build(mid + 1, r, (p << 1) | 1);
}

void updata(register int sx, register int l, register int r, register int p = 1)
{
	if (l == r)
	{
		if (tr[p] == 1e9)
			tr[p] = sx;
		else
			tr[p] = 1e9;
		return;
	}
	register int mid = (l + r) >> 1;
	if (sx <= mid)
		updata(sx, l, mid, p << 1);
	else
		updata(sx, mid + 1, r, (p << 1) | 1);
	tr[p] = min(tr[p << 1], tr[(p << 1) | 1]);
}

int query(register int sl, register int sr, register int l, register int r, register int p = 1)
{
	if (l >= sl && r <= sr)
		return tr[p];
	register int mid = (l + r) >> 1, ret = 1e9;
	if (sl <= mid)
		ret = query(sl, sr, l, mid, p << 1);
	if (sr > mid)
		ret = min(ret, query(sl, sr, mid + 1, r, (p << 1) | 1));
	return ret;
}

int main()
{
	register int n = read(), m = read(), u, v, i, ret;
	for (i = 1;i < n;++ i)
		u = read(), v = read(), add(u, v), add(v, u);
	dfs1(1);
	dfs2(1, 1);
	build(1, n);
	for (i = 1;i <= m;++ i)
	{
		u = read(), v = read();
		if (!u)
			updata(dfn[v], 1, n);
		else
		{
			ret = 1e9;
			while (top[v] != 1)
			{
				ret = min(ret, query(dfn[top[v]], dfn[v], 1, n));
				v = fa[top[v]];
			}
			ret = min(ret, query(1, dfn[v], 1, n));
			if (ret == 1e9)
				puts("-1");
			else
				printf("%d\n", whe[ret]);
		}
	}
	
	return 0;
}
2022/12/9 14:09
加载中...