【在线等】求助树剖0pts
查看原帖
【在线等】求助树剖0pts
551861
strcmp楼主2022/4/11 21:08

rt,请问是哪里写挂了?

#include <bits/stdc++.h>
using namespace std;
#define inf 2147483647
#define V 1000010
#define E 5000010
typedef long long int ll;
struct edge { int to, next; ll w; };
int cnt = 0, head[V], son[V], fa[V], siz[V], dep[V], top[V], dfn[V], id[V], bh[V], ne[V], dct = 0, n, m, r;  edge node[E]; ll w[V];
inline void add(int fir, int nxt, ll w) {
	node[cnt].to = nxt,
		node[cnt].next = head[fir],
		node[cnt].w = w;
    	head[fir] = cnt++;
}
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
struct segtree {
public:
	struct ment {
	public:
		int l, r;
		ll sum, max, min;
		bool tage;
		ment() { tage = l = r = sum = 0; max = -inf, min = inf; }
	};
	vector<ment>tree;
	ll build(int l, int r, int i = 1);
	ll querysum(int l, int r, int i = 1);
	ll querymax(int l, int r, int i = 1);
	ll querymin(int l, int r, int i = 1);
	void modfiy(int l, int r, int i = 1);
	void updata(int n, ll k, int i = 1);
	void pushdown(int i);
	void pushup(int i);

}stree;
ll segtree::build(int l, int r, int i) {
	tree[i].l = l, tree[i].r = r;
	if (l == r) { 
		tree[i].max = tree[i].min = tree[i].sum = w[id[l]]; 
		return tree[i].sum;
	}
	int mid = (l + r) >> 1;
	tree[i].sum = build(l, mid, i << 1) + build(mid + 1, r, (i << 1) | 1);
	tree[i].max = max(tree[ls(i)].max, tree[rs(i)].max);
	tree[i].min = min(tree[ls(i)].min, tree[rs(i)].min);
	return tree[i].sum;
}
inline void segtree::pushdown(int i) {
	if (tree[i].tage) {
		tree[ls(i)].tage ^= 1, tree[rs(i)].tage ^= 1;
		ll ls1 = tree[ls(i)].max, ls2 = tree[rs(i)].max;
		tree[ls(i)].sum = -tree[ls(i)].sum, tree[rs(i)].sum = -tree[rs(i)].sum;
		swap(tree[ls(i)].max, tree[ls(i)].min); swap(tree[rs(i)].max, tree[rs(i)].min);
		tree[ls(i)].min *= -1; tree[ls(i)].max *= -1; tree[rs(i)].min *= -1; tree[rs(i)].max *= -1;
		tree[i].tage = 0;
		pushup(i);
	}
}
inline void segtree::pushup(int i) { 
	tree[i].sum = tree[ls(i)].sum + tree[rs(i)].sum;
	tree[i].max = max(tree[ls(i)].max, tree[rs(i)].max);
	tree[i].max = min(tree[ls(i)].min, tree[rs(i)].min);
}
ll segtree::querysum(int l, int r, int i) {
	ll sum = 0;
	if (tree[i].l >= l && tree[i].r <= r)return tree[i].sum; pushdown(i);
	if (tree[i << 1].r >= l)sum += querysum(l, r, i << 1);
	if (tree[(i << 1) | 1].l <= r)sum += querysum(l, r, (i << 1) | 1);
	return sum;
}
ll segtree::querymax(int l, int r, int i) {
	ll sum = -inf;
	if (tree[i].l >= l && tree[i].r <= r)return tree[i].max; pushdown(i);
	if (tree[i << 1].r >= l)sum = max(sum, querymax(l, r, i << 1));
	if (tree[(i << 1) | 1].l <= r)sum = max(sum, querymax(l, r, (i << 1) | 1));
	return sum;
}
ll segtree::querymin(int l, int r, int i) {
	ll sum = inf;
	if (tree[i].l >= l && tree[i].r <= r)return tree[i].min; pushdown(i);
	if (tree[i << 1].r >= l)sum = min(sum, querymin(l, r, i << 1));
	if (tree[(i << 1) | 1].l <= r)sum = min(sum, querymin(l, r, (i << 1) | 1));
	return sum;
}
void segtree::modfiy(int l, int r, int i) {
	if (tree[i].l >= l && tree[i].r <= r) {
		tree[i].tage ^= 1;
		tree[i].sum = -tree[i].sum;
		swap(tree[i].max, tree[i].min);
		tree[i].max *= -1; tree[i].min *= -1;
		return;
	}pushdown(i);
	if (tree[i << 1].r >= l) modfiy(l, r, i << 1);
	if (tree[(i << 1) | 1].l <= r) modfiy(l, r, (i << 1) | 1);
	pushup(i);
}
void segtree::updata(int n, ll k, int i) {
	if (tree[i].l == tree[i].r) { 
		tree[i].sum = tree[i].max = tree[i].min = k;
		return;
	}
	pushdown(i);
	if (tree[ls(i)].r >= n)updata(n, k, i << 1);
	else if (tree[rs(i)].l <= n)updata(n, k, (i << 1) | 1);
	pushup(i);
}
void dfs1(int v = r, int f = 0) {
	fa[v] = f, siz[v] = 1, dep[v] = dep[f] + 1; int u, msiz = -1, mson = -1;
	for (register int i = head[v]; i != -1; i = node[i].next) {
		u = node[i].to;
		if (u == fa[v])continue;
		w[u] = node[i].w;
		ne[bh[i]] = u;
		dfs1(u, v);
		if (siz[u] > msiz)msiz = siz[u], mson = u;
		siz[v] += siz[u];
	}
	son[v] = mson;
}
void dfs2(int v = r, int t = r) {
	dfn[v] = ++dct, top[v] = t, id[dfn[v]] = v;
	if (son[v] == -1)return;
	dfs2(son[v], t); int u;
	for (register int i = head[v]; i != -1; i = node[i].next) {
		u = node[i].to;
		if (u == son[v] || u == fa[v])continue;
		dfs2(u, u);
	}
}
inline void init() {
	dep[0] = 0, top[r] = r;
	stree.tree.resize(n << 2);
}
inline void modpath(int x, int y) {
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]])swap(x, y);
		stree.modfiy(dfn[top[x]], dfn[x]);
		x = fa[top[x]];
	}
	if (dep[x] > dep[y])swap(x, y);
	if (x == y)return;
	stree.modfiy(dfn[x] + 1, dfn[y]);
}
inline ll quesum(int x, int y) {
	ll sum = 0;
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]])swap(x, y);
		sum += stree.querysum(dfn[top[x]], dfn[x]);
		x = fa[top[x]];
	}
	if (dep[x] > dep[y])swap(x, y);
	if (x == y)return sum;
	return sum + stree.querysum(dfn[x] + 1, dfn[y]);
}
inline ll quemax(int x, int y) {
	ll sum = -inf;
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]])swap(x, y);
		sum = max(sum, stree.querymax(dfn[top[x]], dfn[x]));
		x = fa[top[x]];
	}
	if (dep[x] > dep[y])swap(x, y);
	if (x == y)return sum;
	return max(sum, stree.querymax(dfn[x] + 1, dfn[y]));
}
inline ll quemin(int x, int y) {
	ll sum = inf;
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]])swap(x, y);
		sum = min(sum, stree.querymin(dfn[top[x]], dfn[x]));
		x = fa[top[x]];
	}
	if (dep[x] > dep[y])swap(x, y);
	if (x == y)return sum;
	return min(sum, stree.querymin(dfn[x] + 1, dfn[y]));
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(); cout.tie();
	memset(head, -1, V * sizeof(int));
	cin >> n; r = 1; int x, y; ll z; string q;
	for (register int i = 1; i < n; i++) { 
		bh[i] = cnt; cin >> x >> y >> z;
		add(x + 1, y + 1, z); add(y + 1, x + 1, z);
	}
	cin >> m;
	init(), dfs1(), dfs2(), stree.build(1, n);
	while (m--) {
		cin >> q;
		if (q == "C") { cin >> x >> y; stree.updata(dfn[ne[bh[x]]], y); }
		else if (q == "N") { cin >> x >> y; modpath(x + 1, y + 1); }
		else if (q == "SUM") { cin >> x >> y; cout << quesum(x + 1, y + 1) << endl; }
		else if (q == "MAX") { cin >> x >> y; cout << quemax(x + 1, y + 1) << endl; }
		else { cin >> x >> y; cout << quemin(x + 1, y + 1) << endl; }
	}
	return 0;
}
2022/4/11 21:08
加载中...