萌新全wa求助
查看原帖
萌新全wa求助
450290
MurataHimeko楼主2021/2/8 12:04

求求大佬们帮帮本蒟蒻吧

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

inline char nc () {
    static char buf[1 << 21], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread (buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}

inline int read () {
    register int x(0),f(1);
    char ch = getchar ();
    while (ch > '9' || ch < '0') {if (ch == '-') f = ~f +1; ch = getchar ();}
    while (ch <= '9' && ch >= '0') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar ();}
    return x * f;
}

int n, m;

const int MAXN = 5000005;

struct node {
	int to;
	int next;
	int val;
}e[MAXN << 1];

int head[MAXN << 1], cnt;

void add (int u, int v, int w) {
	e[++cnt] = (node) {v, head[u], w};
	head[u] = cnt;
}

int val[MAXN];
int dep[MAXN], siz[MAXN], fath[MAXN], son[MAXN];

void dfs_1 (int u, int fa) {
	dep[u] = dep[fa] + 1;
	siz[u] = 1;
	fath[u] = fa;
	int max_son = -1;
	for (register int i(head[u]); i; i = e[i].next) {
		int v = e[i].to;
		if (v == fa) continue;
		dfs_1 (v, u);
		val[v] = e[i].val;
		siz[u] += siz[v];
		if (siz[v] > max_son) {
			max_son = siz[v];
			son[u] = v;
		}
	}
}

int top[MAXN], id[MAXN], awa[MAXN];
int tnt;

void dfs_2 (int u, int topf) {
	top[u] = topf;
	id[u] = ++tnt;
	awa[tnt] = u;
	if (!son[u]) return ;
	dfs_2 (son[u], topf);
	for (register int i(head[u]); i; i = e[i].next) {
		int v = e[i].to;
		if (v == fath[u] || v == son[u]) continue;
		dfs_2 (v, v);
	}
}

int laz[MAXN << 2], qmax[MAXN << 2], tag[MAXN << 2];

void push_up (int o) {
	qmax[o] = max (qmax[o<<1], qmax[o<<1|1]);
}

void build (int o, int l, int r) {
	tag[o] = -1;
	if (l == r) {
		qmax[o] = val[awa[l]];
		return ;
	}
	int mid = (l + r) >> 1;
	build (o<<1, l, mid);
	build (o<<1|1, mid + 1, r);
	push_up (o);
}

void pushdown (int o, int l, int r) {
	if (laz[o]) {
		laz[o<<1] += laz[o];
		laz[o<<1|1] += laz[o];
		qmax[o<<1] += laz[o];
		qmax[o<<1|1] += laz[o];
		laz[o] = 0;
	}
	if (tag[o] >= 0) {
		laz[o<<1] = laz[o<<1|1] = 0;
		qmax[o<<1] = qmax[o<<1|1] = tag[o<<1] = tag[o<<1|1] = tag[o];
		tag[o] = -1;
	}
}

int query (int o, int l, int r, int dl, int dr) {
	if (dl <= l && r <= dr) {
		return qmax[o];
	}
	int ans = -0x3f3f3f3f;
	pushdown (o, l, r);
	//printf ("%d %d %d %d %d\n", o, l, r, dl, dr); 
	int mid = (l + r) >> 1;
	if (dl <= mid) ans = max (ans, query (o<<1, l, mid, dl, dr));
	if (dr > mid) ans = max (ans, query (o<<1|1, mid +1, r, dl, dr));
	push_up (o);
	return ans;
}

void update (int o, int l, int r, int dl, int dr, int k) {
	if (dl <= l && r <= dr) {
		laz[o] += k;
		qmax[o] += k;
		return ;
	}
	int mid = (l + r) >> 1;
	pushdown (o, l, r);
	if (dl <= mid) update (o<<1, l, mid, dl, dr, k);
	if (dr > mid) update (o<<1|1, mid +1, r, dl, dr, k);
	push_up (o);
}

void updata (int o, int l, int r, int dl, int dr, int k) {
	if (dl <= l && r <= dr) {
		laz[o] = 0;
		tag[o] = qmax[o] = k;
		return ;
	}
	int mid = (l + r) >> 1;
	pushdown (o, l, r);
	if (dl <= mid) updata (o<<1, l, mid, dl, dr, k);
	if (dr > mid) updata (o<<1|1, mid +1, r, dl, dr, k);
	push_up (o);
}

void revise_cover (int x, int y, int z) {
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]]) swap (x, y);
		updata (1, 1, n, id[top[x]], id[x], z);
		x = fath[top[x]];
	}
	if (dep[x] > dep[y]) swap (x, y);
	updata (1, 1, n, id[x] + 1, id[y], z);
	return ;
}

void revise_add (int x, int y, int z) {
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]]) swap (x, y);
		update (1, 1, n, id[top[x]], id[x], z);
		x = fath[top[x]];
	}
	if (dep[x] > dep[y]) swap (x, y);
	update (1, 1, n, id[x] + 1, id[y], z);
	return ;
}

int access_max (int x, int y) {
	int ans = -0x3f3f3f3f;
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]]) swap (x, y);
		ans = max (ans, query (1, 1, n, id[top[x]], id[x]));
		x = fath[top[x]];
	}
	if (dep[x] > dep[y]) swap (x, y);
	ans = max (ans, query (1, 1, n, id[x] + 1, id[y]));
	return ans;
}

int main () {
	memset (laz, -1, sizeof(laz));
	n = read ();
	for (register int i(1); i < n; ++i) {
		int u = read (), v = read (), w = read ();
		add (u, v, w);
		add (v, u, w);
	}
	dfs_1 (1, 0);
	dfs_2 (1, 1);
	val[1] = -0x3f3f3f3f;
	build (1, 1, n);
	char s[10];
	while (1) {
		scanf ("%s", s);
		if (s[0] == 'S') break;
		else if (s[1] == 'h') {
			int k = read (), w = read ();
			int tmp = id[son[k]];
			if (tmp == 0) tmp = id[k];
			updata (1, 1, n, tmp, tmp, w);
		}
		else if (s[1] == 'o') {
			int u = read (), v = read (), w = read ();
			revise_cover (u, v, w);
		}
		else if (s[1] == 'd') {
			int u = read (), v = read (), w = read ();
			revise_add (u, v, w);
		}
		else if (s[1] == 'a') {
			int u = read (), v = read ();
			printf ("%d\n", access_max (u, v));
		} 
	}
	return 0;
}
2021/2/8 12:04
加载中...