求助 RE
查看原帖
求助 RE
852144
Loser_Syx楼主2024/1/28 11:17
#include <stdio.h>
int dep[100010], cnt, a[100010], dfn[100010], top[100010], fa[100010], siz[100010], val[100010], son[100010], now[100010], u[100010], v[100010], w[100010];
int len, nxt[200010], edge[200010], head[100010], W[200010];
int max(int x, int y) {return x > y ? x : y;}
void insert(int x, int y, int z) {
	edge[++len] = y;
	W[len] = z;
	nxt[len] = head[x];
	head[x] = len;
}
	struct node {
		int l, r, max;
	} t[100010 << 2];
int ls(int k) {return k<<1;}
int rs(int k) {
	return k<<1|1;
}
	void build(int k, int l, int r) {
		t[k].l = l; t[k].r = r;
		if (l == r) {
			t[k].max = a[l];
			return ;
		}
		int mid=(l+r)>>1;
		build(ls(k), l, mid); build(rs(k), mid+1, r);
		t[k].max = max(t[ls(k)].max, t[rs(k)].max);
	}
	void change(int k, int s, int val) {
		int l = t[k].l, r = t[k].r;
		//printf("TEST %d %d\n", l, r);
		if (l == r) {
			t[k].max = val;
			return ;
		}
		int mid=(l+r)>>1;
		if (s <= mid) change(ls(k), s, val);
		else change(rs(k), s, val);
		t[k].max = max(t[ls(k)].max, t[rs(k)].max);
	}
	int query(int k, int L, int R) {
		int l = t[k].l, r = t[k].r;
		if (l >= L && r <= R) return t[k].max;
		int ans = 0;
		int mid=(l+r)>>1;
		if (L <= mid) ans = max(ans, query(ls(k), L, R));
		if (R > mid) ans = max(ans, query(rs(k), L, R));
		return ans;
	}
	int ask(int l, int r) {
		if (l > r) return 0;
		return query(1, l, r);
	}
void dfs1(int u, int f) {
	fa[u] = f;
	siz[u] = 1;
	//printf("TEST %d %d\n", u, f);
	for (int i = head[u]; i; i = nxt[i]) {
		if (edge[i] != f) {
			val[edge[i]] = W[i];
			dfs1(edge[i], u);
			if (siz[edge[i]] > siz[son[u]]) son[u] = edge[i];
			siz[u] += siz[edge[i]];
		}
	}
}
void dfs2(int u, int f) {
	dfn[u] = ++cnt;
	now[cnt] = u;
	dep[u] = dep[fa[u]] + 1;
	top[u] = f;
	if (son[u]) dfs2(son[u], f);
	for (int i = head[u]; i; i = nxt[i]) {
		if (edge[i] != fa[u] && edge[i] != son[u]) {
			dfs2(edge[i], edge[i]);
		}
	}
}
void lca(int u, int v) {
	int ans = 0;
	while (top[u] != top[v]) {
		if (dep[top[u]] > dep[top[v]]) u ^= v ^= u ^= v;
		ans = max(ans, ask(dfn[top[v]], dfn[v]));
		v = fa[top[v]];
	}
	if (dep[u] > dep[v]) u ^= v ^= u ^= v;
	ans = max(ans, ask(dfn[u]+1, dfn[v]));
	printf("%d\n", ans);
}
int main() {
    int t; scanf("%d", &t); while (t--) {
    int n; scanf("%d", &n); len = cnt = 0;
	for (int i = 1; i <= n; ++i) head[i] = siz[i] = dep[i] = 0;
	for (int i = 1; i < n; ++i) {
		scanf("%d %d %d", &u[i], &v[i], &w[i]);
		insert(u[i], v[i], w[i]);
		insert(v[i], u[i], w[i]);
	}
	dfs1(1, 0);
	dfs2(1, 1);
	for (int i = 1; i <= n; ++i) a[i] = val[now[i]];
	char s[111];
	build(1, 1, n);
//	puts("");
//	for (int i = 1; i <= n; ++i) printf("%d ", fa[i]);
//	puts("");
	while (~scanf("%s",s+1)) {
		if (s[1] == 'D') break;
		int x, y; scanf("%d %d", &x, &y);
		if (s[1] == 'C') {
			if (fa[v[x]] == u[x]) change(1, dfn[v[x]], y); 
			else change(1, dfn[u[x]], y);
		} else {
			lca(x, y);
		}
	} }
	return 0;
}
2024/1/28 11:17
加载中...