MLE 求看
查看原帖
MLE 求看
770611
xxxxxzy楼主2025/1/1 13:33

我交了二十多发了,基本上每次都是 MLE on #2。

有没有好心人帮我看一下为什么 MLE 了 /kel /kel。

静态的空间有输出,只有 390 MiB 左右。

#include <bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define drep(i,a,b) for(int i=a;i>=b;i--)
#define fi first
#define se second
#define pb push_back
#define ld lower_bound
#define ud upper_bound
#define pii pair<int,int>
#define mp(x,y) make_pair(x,y)
#define pdi pair<double,int>
#define N 500005
#define siz(a) (int)a.size()
using namespace std;
bool bg;
int n, q, k, C, op, x, c, d, tot, in[N], g[N * 2], f[N * 2][21], fa[N], rt[N], col[N], dep[N], Log[N * 2];
ll dis[N];
vector <pii> G[N];
void init() {
	rep (i, 2, tot) Log[i] = Log[i >> 1] + 1;
	rep (i, 1, tot) f[i][0] = g[i];
	rep (j, 1, 20) {
		rep (i, 1, tot - (1 << j) + 1) {
			if (dep[f[i][j - 1]] < dep[f[i + (1 << (j - 1))][j - 1]]) f[i][j] = f[i][j - 1];
			else f[i][j] = f[i + (1 << (j - 1))][j - 1];
		}
	}
}
inline int lca(int l, int r) {
	l = in[l], r = in[r], k = Log[r - l + 1];
	if (dep[f[l][k]] < dep[f[r - (1 << k) + 1][k]]) return f[l][k];
	return f[r - (1 << k) + 1][k];
}
inline ll dist(int u, int v) {
	return dis[u] + dis[v] - dis[lca(u, v)] * 2;
}
inline void dfs1(int u, int f) {
	g[in[u] = ++tot] = u; dep[u] = dep[f] + 1; fa[u] = f;
	for (pii &s : G[u]) {
		int v = s.fi, w = s.se;
		if (v == f) continue;
		dis[v] = dis[u] + w;
		dfs1(v, u), g[++tot] = u;
	}
}
struct node {
	int u, v;
	ll d;
	node (int a, int b, ll c) {
		u = a, v = b, d = c;
	}
	node () { u = v = d = 0; }
	inline friend node operator + (node &a, node &b) {
		ll dis; node c;
		if (!a.u) return b;
		if (!b.u) return a;
		if ((dis = dist(a.u, a.v)) >= c.d) c.d = dis, c.u = a.u, c.v = a.v;
		if ((dis = dist(a.u, b.v)) >= c.d) c.d = dis, c.u = a.u, c.v = b.v;
		if ((dis = dist(b.u, a.v)) >= c.d) c.d = dis, c.u = b.u, c.v = a.v;
		if ((dis = dist(b.u, b.v)) >= c.d) c.d = dis, c.u = b.u, c.v = b.v;
		if ((dis = dist(a.v, b.v)) >= c.d) c.d = dis, c.u = a.v, c.v = b.v;
		if ((dis = dist(a.u, b.u)) >= c.d) c.d = dis, c.u = a.u, c.v = b.u;
		return c;
	}
	inline friend node operator * (node &a, node &b) { //different
		ll dis; node c;
		if (!a.u) return b;
		if (!b.u) return a;
		if ((dis = dist(a.u, b.v)) >= c.d) c.d = dis, c.u = a.u, c.v = b.v;
		if ((dis = dist(b.u, a.v)) >= c.d) c.d = dis, c.u = b.u, c.v = a.v;
		if ((dis = dist(a.v, b.v)) >= c.d) c.d = dis, c.u = a.v, c.v = b.v;
		if ((dis = dist(a.u, b.u)) >= c.d) c.d = dis, c.u = a.u, c.v = b.u;
		return c;
	}                                                   
}t[N * 20], s[N << 2];
struct Tree {
	int tot, ls[N * 20], rs[N * 20];                    
	inline void build() { rep (i, 0, tot) t[i] = node(), ls[i] = rs[i] = 0; tot = 0; }
	inline void upd(int &p, int x, int v, int l = 1, int r = q) {
		if (l > x || r < x) return ;
		if (!p) p = ++tot;
		if (l == r) return (void)(t[p] = node(v * l, v * l, 0));
		int mid = (l + r) >> 1;
		upd(ls[p], x, v, l, mid); upd(rs[p], x, v, mid + 1, r);
		t[p] = t[ls[p]] + t[rs[p]]; 
	}
}T;
inline void build(int p = 1, int l = 1, int r = q) {
	s[p] = node();
	if (l == r) return ;
	int mid = (l + r) >> 1;
	build(p << 1, l, mid); build(p << 1 | 1, mid + 1, r);
}
inline void upd(int p, int x, node &v, int l = 1, int r = q) {
	if (l > x || r < x) return ;
	if (l == r) return (void)(s[p] = v);
	int mid = (l + r) >> 1;
	upd(p << 1, x, v, l, mid); upd(p << 1 | 1, x, v, mid + 1, r);
	s[p] = s[p << 1] * s[p << 1 | 1];
}
pii Q[N];
int cnt[N], num;
inline void solve() {
	cin >> q >> C;
	rep (i, 1, q) G[i].clear();
	rep (i, 1, q) rt[i] = cnt[i] = col[i] = 0;
	n = 1; num = tot = 0;
	rep (i, 1, q) cnt[i] = 0;
	rep (i, 1, q) {
		cin >> op;
		if (op == 0) cin >> x >> c >> d, n++, G[x].pb(mp(n, d)), G[n].pb(mp(x, d)), x = n;
		else cin >> x >> c;
		Q[i] = mp(x, c);
	}
	T.build(); build();
	dfs1(1, 0); init();
//	cout << dist(2, 4) << "\n";
	T.upd(rt[C], 1, 1); upd(1, C, t[rt[C]]); col[1] = C; cnt[C]++; num++;
	rep (i, 1, q) {
		x = Q[i].fi, c = Q[i].se;
//		cout << "upd " << x << " " << c << "\n";
		if (col[x]) T.upd(rt[col[x]], x, 0), upd(1, col[x], t[rt[col[x]]]), num -= (cnt[col[x]] == 1), cnt[col[x]]--;
		col[x] = c;
		num += (cnt[col[x]] == 0), cnt[col[x]]++;
		T.upd(rt[col[x]], x, 1), upd(1, col[x], t[rt[col[x]]]);
		if (num == 1) cout << "0\n";
		else cout << s[1].d << "\n";
	}
}
bool ed;
signed main() {
	IOS;
	cerr << ((&bg - &ed) * 1.0 / 1024 / 1024) << "\n";
	int T; cin >> T;
	while (T--) solve();
}
2025/1/1 13:33
加载中...