RE 1-11 WA 12求助
查看原帖
RE 1-11 WA 12求助
416242
New_hope楼主2024/1/10 19:13

样例可过

#include<bits/stdc++.h>
#define inf (int)(2e9 + 4)
#define _ (int)(4e5 + 4)
using namespace std;

int n, m;
int o, hd[_];
struct ed {
	int v, w, ne;
} e[_ << 2];
struct info {
	int mx, mn, sum, tg;
} tree[_ << 2];

int c, d[_], siz[_], hson[_], fa[_], top[_], dfn[_], rk[_], val[_];

void add(int u, int v, int w) {
	e[++o] = {v, w, hd[u]};
	hd[u] = o;
}

namespace Seg {
	#define L (fa << 1)
	#define R (fa << 1 | 1)
	#define mid (l + r >> 1)
	auto merge(info l, info r) {
		return (info) {
			max(l.mx, r.mx), 
			min(l.mn, r.mn), 
			l.sum + r.sum, 0
		};
	}
	auto cover(int fa) {
		return (info) {
			-tree[fa].mn, 
			-tree[fa].mx, 
			-tree[fa].sum, 
			!tree[fa].tg
		};
	}
	void build(int fa, int l, int r) {
		if(l == r) {
			int tp = val[rk[l]];
			tree[fa] = {tp, tp, tp, 0};
			return ;
		}
		build(L, l, mid), build(R, mid + 1, r);
		tree[fa] = merge(tree[L], tree[R]);
	}
	void push_down(int fa) {
		if(!tree[fa].tg) return ;
		cover(L), cover(R);
		tree[fa].tg = 0;
	}
	void update(int fa, int l, int r, int ql, int qr, int w, bool f) {
		if(ql <= l && r <= qr) {
			if(!f) tree[fa] = {w, w, w, 0}; 
			else tree[fa] = cover(fa);
			return ;
		}
		push_down(fa);
		if(ql <= mid) update(L, l, mid, ql, qr, w, f);
		if(qr > mid) update(R, mid + 1, r, ql, qr, w, f);
		tree[fa] = merge(tree[L], tree[R]);
	}
	auto query(int fa, int l, int r, int ql, int qr) {
		if(ql <= l && r <= qr) return tree[fa];
		push_down(fa);
		if(qr <= mid) return query(L, l, mid, ql, qr);
		else if(ql > mid) return query(R, mid + 1, r, ql, qr);
		else {
			info lson = query(L, l, mid, ql, qr), rson = query(R, mid + 1, r, ql, qr);
			return merge(lson, rson); 
		}
	}
}

namespace Cut {
	void dfs1(int u) {
		siz[u] = 1;
		for(int i = hd[u]; i; i = e[i].ne) {
			int v = e[i].v, w = e[i].w;
			if(v == fa[u]) continue;
			fa[v] = u, d[v] = d[u] + 1, val[v] = w;
			dfs1(v); siz[u] += siz[v];
			if(siz[v] > siz[hson[u]]) hson[u] = v;
		}
	}
	void dfs2(int u, int tp) {
		dfn[u] = ++c, rk[c] = u, top[u] = tp;
		if(hson[u]) dfs2(hson[u], tp);
		for(int i = hd[u]; i; i = e[i].ne) {
			int v = e[i].v;
			if(v == fa[u] || v == hson[u]) continue;
			dfs2(v, v);
		} 
	}
	void tree_up(int u, int v) {
		while(top[u] != top[v]) {
			if(d[top[u]] < d[top[v]]) swap(u, v);
			Seg :: update(1, 1, n, dfn[top[u]] + 1, dfn[u], 0, 1);
			u = fa[top[u]];
		}
		if(d[u] < d[v]) swap(u, v);
		Seg :: update(1, 1, n, dfn[v] + 1, dfn[u], 0, 1); 
	}
	auto tree_q(int u, int v) {
		info r, tp;
		r = {-inf, inf, 0, 0};
		while(top[u] != top[v]) {
			if(d[top[u]] < d[top[v]]) swap(u, v);
			tp = Seg :: query(1, 1, n, dfn[top[u]] + 1, dfn[u]);
			r = Seg :: merge(tp, r);
			u = fa[top[u]];
		}
		if(d[u] < d[v]) swap(u, v);
		tp = Seg :: query(1, 1, n, dfn[v] + 1, dfn[u]); 
		r = Seg :: merge(tp, r);
		return r;
	} 
}

int main() {
	
	cin >> n;
	for(int i = 1; i < n; i ++) {
		int u, v, w;
		cin >> u >> v >> w; 
		u ++, v ++;
		add(u, v, w), add(v, u, w);
	}
	Cut :: dfs1(1), Cut :: dfs2(1, 1);
	Seg :: build(1, 1, n);
	
	cin >> m;
	for(int i = 1; i <= m; i ++) {
		string opt;
		int x, y;
		cin >> opt >> x >> y;
		if(opt == "C") {
			int a = e[2 * x - 1].v, b = e[2 * x].v;
			int p = (d[a] > d[b] ? a : b);
			Seg :: update(1, 1, n, dfn[p], dfn[p], y, 0);
		}
		else {
			x ++, y ++;
			if(opt == "N") Cut :: tree_up(x, y);
			else {
				info ans = Cut :: tree_q(x, y);
				if(opt == "SUM") cout << ans.sum << endl;
				else if(opt == "MAX") cout << ans.mx << endl;
				else  cout << ans.mn << endl;
			}
		}
	}
	return 0;
} 
/*
3
0 1 1
1 2 2
8
SUM 0 2
MAX 0 2
N 0 1
SUM 0 2
MIN 0 2
C 1 3
SUM 0 2
MAX 0 2
*/
2024/1/10 19:13
加载中...