我交了二十多发了,基本上每次都是 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();
}