求助 ub
查看原帖
求助 ub
743447
RegisterIntOfficial楼主2022/12/28 18:22

开 O2 全 RE,不开 AC

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 5e4 + 10;
const int inf = ~0u >> 1;

struct edge {
	int v, nxt;
} e[MAXN << 1];

int head[MAXN], tot;

inline 
void add(int u, int v) {
	e[++tot] = { v, head[u] }, head[u] = tot;
}

int fa[MAXN], dep[MAXN], size[MAXN], son[MAXN];
int top[MAXN], id[MAXN], cnt;

void dfs1(int u, int f) {
	fa[u] = f, dep[u] = dep[f] + 1, size[u] = 1;
	for (int i = head[u], v; i; i = e[i].nxt) {
		v = e[i].v;
		if (v == f) continue;
		dfs1(v, u), size[u] += size[v];
		if (size[son[u]] < size[v]) son[u] = v;
	}
}

void dfs2(int u, int t) {
	top[u] = t, id[u] = ++cnt;
	if (son[u]) dfs2(son[u], t);
	for (int i = head[u]; i; i = e[i].nxt) {
		if (e[i].v != fa[u] && e[i].v != son[u]) dfs2(e[i].v, e[i].v);
	}
}

struct segtree{
	int l, r, val, tag;
} t[MAXN << 2];

inline 
void pushup(int p) {
	t[p].val = min(t[p << 1].val, t[p << 1 | 1].val);
}

inline 
void pushdown(int p) {
	if (t[p].tag == inf) return ;
	t[p << 1].val = min(t[p << 1].val, t[p].tag);
	t[p << 1 | 1].val = min(t[p << 1 | 1].val, t[p].tag);
	t[p << 1].tag = min(t[p << 1].tag, t[p].tag);
	t[p << 1 | 1].tag = min(t[p << 1 | 1].tag, t[p].tag);
	t[p].tag = inf;
}

void build(int l, int r, int p) {
	t[p].l = l, t[p].r = r, t[p].tag = inf;
	if (l == r) return t[p].val = inf, void();
	int mid = l + r >> 1;
	build(l, mid, p << 1), build(mid + 1, r, p << 1 | 1);
	pushup(p);
}

void modify(int l, int r, int x, int p) {
	if (l <= t[p].l && t[p].r <= r) return t[p].val = min(t[p].val, x), t[p].tag = min(t[p].tag, x), void();
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1;
	if (l <= mid) modify(l, r, x, p << 1);
	if (r > mid) modify(l, r, x, p << 1 | 1);
	pushup(p);
}

int query(int k, int p) {
	if (t[p].l == t[p].r) return t[p].val;
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1;
	return query(k, p << 1 | k > mid);
}

inline 
int mrange(int u, int v, int x) {
	while (top[u] != top[v]) {
		if (dep[top[u]] < dep[top[v]]) swap(u, v);
		modify(id[top[u]], id[u], x, 1), u = fa[top[u]];
	}
	if (dep[u] > dep[v]) swap(u, v);
	if (u != v) modify(id[u] + 1, id[v], x, 1);
}

int n, m, u[MAXN], v[MAXN];

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i < n; i++) scanf("%d%d", &u[i], &v[i]), add(u[i], v[i]), add(v[i], u[i]);
	dfs1(1, 0), dfs2(1, 1), build(1, n, 1);
	for (int i = 1, x, y, k; i <= m; i++) scanf("%d%d%d", &x, &y, &k), mrange(x, y, k);
	for (int i = 1, t; i < n; i++) printf("%d\n", (t = query(id[dep[u[i]] > dep[v[i]] ? u[i] : v[i]], 1)) == inf ? -1 : t);
}
2022/12/28 18:22
加载中...