水题求助!
查看原帖
水题求助!
672281
InversionShadow楼主2023/11/10 08:58

树剖板题全 WA

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6;

int siz[N], son[N], head[N], dep[N], fa[N], top[N], cnt, dfn[N], rnk[N], n, tot, val[N];
string s;

struct Node{
	int nxt, to, w;
} e[N];

void dfs1(int u, int f) {
	siz[u] = 1;
	son[u] = -1;
	for (int i = head[u]; i; i = e[i].nxt) {
		int v = e[i].to;
		if (v == f) {
			continue;
		}
		dep[v] = dep[u] + 1;
		fa[v] = u;
		val[v] = e[(i + 1) / 2].w;
		dfs1(v, u);
		siz[u] += siz[v];
		if (son[u] == -1 || siz[v] > siz[son[u]]) {
			son[u] = v;
		}
	}
}

void dfs2(int u, int f) {
	top[u] = f;
	cnt++;
	dfn[u] = cnt;
	rnk[cnt] = u;
	if (son[u] == -1) {
		return ;
	}
	dfs2(son[u], f);
	for (int i = head[u]; i; i = e[i].nxt) {
		int v = e[i].to;
		if (v != son[u] && v != fa[u]) {
			dfs2(v, v);
		}
	}
}

struct SegTree{
	int maxx[N << 2];
	
	void pushup(int p) {
		maxx[p] = max(maxx[p << 1], maxx[p << 1 | 1]);
	}
	
	void biuld(int p, int l, int r) {
		if (l == r) {
			maxx[p] = val[rnk[p]];
			return ;
		}
		int mid = l + r >> 1;
		biuld(p << 1, l, mid);
		biuld(p << 1 | 1, mid + 1, r);
		pushup(p);
	}
	
	int st_querymax(int p, int l, int r, int ql, int qr) {
		if (l > qr || r < ql) {
			return -1e9;
		}
		if (ql <= l && qr >= r) {
			return maxx[p];
		}
		int mid = l + r >> 1;
		int maxx = -1e9;
		if (ql <= mid) {
			maxx = max(maxx, st_querymax(p << 1, l, mid, ql, qr));
		} 
		if (qr > mid) {
			maxx = max(maxx, st_querymax(p << 1 | 1, mid + 1, r, ql, qr));
		}
		return maxx;
	}
	
	void update(int p, int l, int r, int x, int k) {
		if (l == r) {
			maxx[p] = k;
			return ;
		}
		int mid = l + r >> 1;
		if (x <= mid) {
			update(p << 1, l, mid, x, k);
		} else {
			update(p << 1 | 1, mid + 1, r, x, k);
		}
		pushup(p);
	}
} st;

int querymax(int x, int y) {
	int maxx = -1, fx = top[x], fy = top[y];
	while (fx != fy) {
		if (dep[fx] >= dep[fy]) {
			maxx = max(maxx, st.st_querymax(1, 1, n, dfn[fx], dfn[x]));
			x = fa[fx];
		} else {
			maxx = max(maxx, st.st_querymax(1, 1, n, dfn[fy], dfn[y]));
			y = fa[fy];
		}
		fx = top[x];
		fy = top[y];
	}
//	cout << maxx << endl;
	maxx = max(maxx, st.st_querymax(1, 1, n, dfn[x] + 1, dfn[y]));
	return maxx;
}	

void add(int u, int v, int w) {
	e[++tot].to = v;
	e[tot].nxt = head[u];
	e[tot].w = w;
	head[u] = tot;
}

int main() {
	cin >> n;
	for (int i = 1; i < n; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
		add(v, u, w);
	}
	dep[1] = 1;
	dfs1(1, 0);
	dfs2(1, 1);
	st.biuld(1, 1, n);
	while (cin >> s) {
		if (s == "DONE") {
			break;
		}
		if (s == "CHANGE") {
			int x, t, b = 0;
			cin >> x >> t;
			if(dep[e[x].to] > dep[e[x].nxt]) {
				b = e[x].to;
			} else {
				b = e[x].nxt;
			}
			st.update(1, 1, n, dfn[b], t);
		} else {
			int a, b;
			cin >> a >> b;
			if (a == b) {
				cout << "0\n";
			} else {
				cout << querymax(a, b) << endl;
			}
		}
	}
	return 0;
}
2023/11/10 08:58
加载中...