萌新不理解
查看原帖
萌新不理解
560516
喵仔牛奶楼主2022/9/5 20:43

rt,为什么第一份今天写的代码 A 了,第二份上上周写都 WA on #5?

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5, inf = 1e18;
struct edge {
	int to, next, w;
} e[N << 1];
struct QAQ {
	int u, v, w;
	bool operator < (const QAQ& x) const {
		return w < x.w;
	}
} d[N << 1], awa[N << 1];
int depth[N], f[N][32], qwq[N][32], fa[N], head[N], val[N];
int cnt, sum, n, m, q, s, u, v, w, MST;
bool vis[N];
inline int cmax(int x, int y) {
	return x < y ? y : x;
}
inline void dfs(int u) {
	vis[u] = true;
	for (int i = head[u]; i; i = e[i].next) {
		int v = e[i].to;
		if (vis[v]) continue;
		depth[v] = depth[u] + 1;
		f[v][0] = u, qwq[v][0] = e[i].w;
		dfs(v);
	}
}
inline int LCA(int x, int y) {
	int ans = -inf;
	if (depth[x] < depth[y]) swap(x, y);
	for (int i = 20; i >= 0; -- i) {
		if (depth[f[x][i]] < depth[y]) continue;
		ans = cmax(ans, qwq[x][i]);
		x = f[x][i];
	}
	if (x == y) return ans;
	for (int i = 20; i >= 0; -- i) {
		if (f[x][i] == f[y][i]) continue;
		ans = cmax(ans, cmax(qwq[x][i], qwq[y][i]));
		x = f[x][i], y = f[y][i];
	}
	return cmax(ans, cmax(qwq[x][0], qwq [y][0]));
}
inline int find(int x) {
	return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
inline void add(int u, int v, int w) {
	e[++ cnt].to = v;
	e[cnt].w = w;
	e[cnt].next = head[u];
	head[u] = cnt;
}
void kruskal() {
	sort(d + 1, d + 1 + m);
	for (int i = 1; i <= n; i ++)
		fa[i] = i;
	for (int i = 1; i <= m; i ++) {
		int fu = find(d[i].u), fv = find(d[i].v);
		if (fu != fv) {
			add(d[i].u, d[i].v, d[i].w);
			add(d[i].v, d[i].u, d[i].w);
			fa[fu] = fv, sum ++, MST += d[i].w;
		}
		if (sum == n - 1) break;
	}
}
inline int read() {
	register int t = 1, a = 0;
	register char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') t = -1;
		ch = getchar();
	}
	while (ch <= '9' && ch >= '0')
		a = a * 10 + ch - '0', ch = getchar();
	return a * t;
}
inline void write(long long x) {
	if (x < 0) putchar('-'), x = -x;
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
signed main() {
	n = read(), m = read();
	for (int i = 1; i <= m; i ++)
		d[i].u = read(), d[i].v = read(), d[i].w = read(), awa[i] = d[i];
	kruskal();
	for (int i = 1; i <= n; i ++) {
		if (vis[i]) continue;
		depth[i] = 1, dfs(i);
		f[i][0] = i, qwq[i][0] = -inf;
	}
	for (int j = 1; j <= 20; j ++) 
		for (int i = 1; i <= n; i ++) {
			f[i][j] = f[f[i][j - 1]][j - 1];
			qwq[i][j] = cmax(qwq[i][j - 1], qwq[f[i][j - 1]][j - 1]);
		}
	for (int i = 1; i <= m; i ++)
		write(MST - LCA(awa[i].u, awa[i].v) + awa[i].w), putchar('\n');
	return 0;
}
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N = 2e5 + 5, rt = 1, mod = 1e9 + 7, inf = 1e18;
struct edge {
    ll u, v, w;
    bool operator < (const edge& x) const {
        return w < x.w;
    }
} e[N << 1];
ll fa[N], lg[N], f[N][32], s[N], t[N], w[N];
ll cnt, n, m, u, v, ans, sum;
namespace MST {
    struct edge {
        ll to, w, next;
    } e[N << 1];
    ll w[N], head[N], fa[N], id[N], siz[N], top[N], depth[N], son[N];
    int edge_cnt, cnt;
    ll query(int l, int r) {
        int k = lg[r - l + 1], p = 1 << k;
        return max(f[l][k], f[r - p + 1][k]);
    }
    void dfs1(int u, int f, int dep) {
        fa[u] = f, siz[u] = 1, depth[u] = dep;
        for (int i = head[u]; i; i = e[i].next) {
            int v = e[i].to;
            if (v == f) continue;
            w[v] = e[i].w, dfs1(v, u, dep + 1);
            if (siz[v] > siz[son[u]])
                son[u] = v;
            siz[u] += siz[v];
        }
    }
    void dfs2(int u, int topf) {
        id[u] = ++ cnt, f[cnt][0] = w[u], top[u] = topf;
        if (!son[u]) return;
        dfs2(son[u], topf);
        for (int i = head[u]; i; i = e[i].next) {
            int v = e[i].to;
            if (v == son[u] || v == fa[u]) continue;
            dfs2(v, v);
        }
    }
    ll qRange(int u, int v) {
        ll ans = -inf;
        while (top[u] != top[v]) {
            if (depth[top[u]] < depth[top[v]]) swap(u, v);
            ans = max(ans, query(id[top[u]], id[u])), u = fa[top[u]];
        }
        if (depth[u] > depth[v]) swap(u, v);
        return max(ans, query(id[u] + 1, id[v]));
    }
    void add(int u, int v, int w) {
        e[++ edge_cnt].to = v;
        e[edge_cnt].w = w;
        e[edge_cnt].next = head[u];
        head[u] = edge_cnt;
    }
}
int find(int x) {
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void Kruskal() {
    sort(e + 1, e + 1 + m);
    for (int i = 1; i <= m; i ++) {
        int fu = find(e[i].u), fv = find(e[i].v);
        if (fu != fv) {
            fa[fv] = fu, ans += e[i].w, sum ++;
            MST::add(e[i].u, e[i].v, e[i].w), MST::add(e[i].v, e[i].u, e[i].w);
        }
        if (sum == n - 1) break;
    }
}
void add(int u, int v, int w) {
    e[++ cnt].u = u;
    e[cnt].v = v;
    e[cnt].w = w;
}
signed main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i ++)
        cin >> s[i] >> t[i] >> w[i], add(s[i], t[i], w[i]);
    for (int i = 1; i <= n; i ++) fa[i] = i;
    for (int i = 2; i <= n; i ++) lg[i] = lg[i / 2] + 1;
    Kruskal(), MST::dfs1(1, 0, 1), MST::dfs2(1, 1);
    for (int j = 1; j <= lg[n] + 1; j ++)
        for (int i = 1; i + (1 << j) - 1 <= n; i ++)
            f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
    for (int i = 1; i <= m; i ++)
        cout << ans - MST::qRange(s[i], t[i]) + w[i] << '\n';
    return 0;
}
2022/9/5 20:43
加载中...