求助,WA on #4 #10,有没有人帮忙看一下
查看原帖
求助,WA on #4 #10,有没有人帮忙看一下
165375
Fast_Gai_Tle楼主2021/11/9 21:43
#include <cstdio>
#include <algorithm>
#include <iostream>
#define re register
#define rm ((l+r)/2+1)
#define lm ((l+r)/2)
#define rs (x<<1|1)
#define ls (x<<1)
using namespace std;
char buf[1<<26], *p1 = buf, *p2 = buf, obuf[1<<26], *O = obuf;
#define gc() (p1 == p2 && (p2 = (p1 + fread(buf, 1, 1<<25, stdin)), p1 == p2)) ? EOF : *p1++
#define pc(x) (O - obuf < 1<<25) ? (*O++ = x) : (fwrite(obuf, O - obuf, 1, stdout), O = obuf, *O++ = x)
template <class T> inline void read(T &n) {
	n = 0; char ch = gc(); while(!isdigit(ch)) ch = gc();
	while(isdigit(ch)) n = (n<<1)+(n<<3)+(ch^48), ch = gc();
}
template <class T> void write(T n) { if(n > 9) return write(n/10), pc(n%10^48), void(); pc(n^48); }
typedef long long LL;
const int N = 1e5 + 5, M = 3e5 + 5;
LL w[2*M], v[N];
int n, m, tot, f[N], e[2*M], nxt[2*M], head[N];
void addedge(int x, int y, LL z) { e[++tot] = y; nxt[tot] = head[x]; w[tot] = z; head[x] = tot; }
struct date { LL val; int from, to; }E[M];
bool cmp(date s, date r) { return s.val < r.val; }
int find(int x) { return (f[x] == x) ? x : f[x] = find(f[x]); }
int sz[N], son[N], top[N], dep[N], fa[N];
void dfs(int u, int last) {
	sz[u] = 1; dep[u] = dep[last] + 1; fa[u] = last;
	for(re int i = head[u]; i; i = nxt[i]) {
		if(e[i] == last) continue;
		dfs(e[i], u); sz[u] += sz[e[i]];
		if(sz[son[u]] < sz[e[i]])
			son[u] = e[i];
		v[e[i]] = w[i];
	}
}
int id[N], rk[N];
void dfs2(int u, int t) {
	top[u] = t; id[u] = ++tot; rk[tot] = u;
	if(!son[u]) return ; dfs2(son[u], t);
	for(re int i = head[u]; i; i = nxt[i]) {
		if(e[i] == son[u] || e[i] == fa[u]) continue;
		dfs2(e[i], e[i]);
	}
}
struct MX { LL mx, mix; MX() { mx = mix = 0LL; } MX(LL a, LL b) { mx = a, mix = b; } } t[N<<2];
inline MX Max(MX a, MX b) {
	return MX(max(a.mx, b.mx), max(max(a.mix, b.mix), (a.mx == b.mx) ? 0 : min(a.mx, b.mx)));
}
void pushup(int x) { t[x] = Max(t[ls], t[rs]); }
void build(int x, int l, int r) {
	if(l == r) return t[x].mx = v[rk[l]], void();
	build(ls, l, lm); build(rs, rm, r);
	pushup(x);
}
MX query(int x, int l, int r, int ll, int rr) {
	if(ll > rr) return MX(0, 0);
	if(ll <= l && r <= rr) return t[x]; MX res;
	if(lm >= ll) res = Max(res, query(ls, l, lm, ll, rr));
	if(rm <= rr) res = Max(res, query(rs, rm, r, ll, rr));
	return res;
}
int flag[M];
LL ans, Ans = 1e18;
void calc(int eg) {
	if(dep[E[eg].from] > dep[E[eg].to]) swap(E[eg].from, E[eg].to);
	int x = E[eg].from, y = E[eg].to;
	if(flag[eg]) return ; MX res;
	while(top[x] != top[y]) {
		// write(id[top[y]]); pc(' '); write(id[y]); pc(' '); write(query(1, 1, n, id[top[y]], id[y])); pc('\n');
		if(dep[top[x]] >= dep[top[y]]) res = Max(res, query(1, 1, n, id[top[x]], id[x])), x = fa[top[x]];
		else res = Max(res, query(1, 1, n, id[top[y]], id[y])), y = fa[top[y]];
		// write(res); pc('\n');
	}
	if(dep[x] >= dep[y]) swap(x, y);
	if(x == E[eg].from) res = Max(res, query(1, 1, n, id[x] + 1, id[y]));
	else res = Max(res, query(1, 1, n, id[x], id[y]));
	// write(res); pc('\n');
	// write(E[eg].from); pc(' '); write(E[eg].to); pc(' '); write(res.mx); pc(' '); write(res.mix); pc('\n');
	if(res.mx != E[eg].val) Ans = min(Ans, ans + E[eg].val - res.mx);
	else Ans = min(Ans, ans + E[eg].val - res.mix);
}
int main() {
	read(n); read(m);
	for(re int i = 1; i <= n; ++i) f[i] = i;
	for(re int i = 1; i <= m; ++i) { read(E[i].from); read(E[i].to); read(E[i].val); }
	sort(E + 1, E + m + 1, cmp); tot = 0;
	for(re int i = 1; i <= m; ++i) {
		int r1 = find(E[i].from), r2 = find(E[i].to);
		if(r1 == r2) continue;
		addedge(E[i].from, E[i].to, E[i].val);
		addedge(E[i].to, E[i].from, E[i].val);
		f[r2] = r1; ans += E[i].val; flag[i] = 1;
	}
	// write(ans); pc('\n');
	tot = 0; dfs(1, 0); dfs2(1, 1); build(1, 1, n);
	// for(re int i = 1; i <= n; ++i) write(v[i]), pc('\n');
	for(re int i = 1; i <= m; ++i) calc(i);
	write(Ans); pc('\n');
	fwrite(obuf, O - obuf, 1, stdout);
	return 0;
}
2021/11/9 21:43
加载中...