萌新45pts求助
查看原帖
萌新45pts求助
677234
FstAutoMaton楼主2024/3/24 21:11

RT,目前讨论区能看到的hack都过了(有一些系统维护看不见不知道对不对)

#include <bits/stdc++.h>

using namespace std;
using LL = long long;
using Pii = pair<LL, LL>;

const int kMaxN = 1e6 + 5;
const LL kInf = 1e16;

int vis[kMaxN], v[kMaxN], s[kMaxN << 1], q[kMaxN << 1], ind[kMaxN], l = 1, r, tot, n;
LL f[kMaxN], lx[kMaxN << 1], rx[kMaxN << 1], vs[kMaxN << 1], ans, val;
vector<Pii> g[kMaxN];
vector<int> id[kMaxN];

void D(int u, int fa) {
  vector<LL> vp;
  for (Pii i : g[u]) {
    if (i.first != fa && vis[i.first]) {
      D(i.first, u);
      f[u] = max(f[u], f[i.first] + i.second);
      vp.push_back(f[i.first] + i.second);
    }
  }
  sort(vp.begin(), vp.end(), greater<LL>());
  (vp.size() > 1) && (val = max(val, vp[0] + vp[1]));
  vp.size() && (val = max(val, vp[0]));
}

void S(int u, int pre) {
  s[++tot] = u, v[u] = 1;
  for (int p = 0; p < g[u].size(); p++) {
    Pii i = g[u][p];
    if (!vis[i.first] && !v[i.first]) {
      vs[tot] = i.second;
      S(i.first, id[u][p]);
    } else if (!vis[i.first] && v[i.first] && pre != id[u][p]) {
      vs[tot] = i.second;
    }
  }
}

void V() {
  for (int i = 1; i <= tot; i++) {
    s[i + tot] = s[i], vs[i + tot] = vs[i];
  }
  LL tag = 0;
  l = 1, r = 0;
  for (int i = 1; i <= tot * 2; i++) {
    for (; l <= r && q[l] <= i - tot; l++) {
    }
    q[++r] = i, lx[i] = f[s[i]] - tag;
    val = max(val, (l == r) ? (lx[q[l]] + tag) : (lx[q[l]] + tag + f[s[i]]));
    tag += vs[i];
  }
  l = 1, r = tag = 0;
  for (int i = tot * 2; i >= 1; i--) {
    for (; l <= r && q[l] >= i + tot; l++) {
    }
    q[++r] = i, lx[i] = f[s[i]] - tag;
    val = max(val, (l == r) ? (lx[q[l]] + tag) : (lx[q[l]] + tag + f[s[i]]));
    tag += vs[i - 1];
  }
  for (int i = 1; i <= r; i++) {
    q[i] = 0;
  }
  for (int i = 1; i <= tot * 2; i++) {
    lx[i] = rx[i] = 0;
    vs[i] = s[i] = 0;
  }
}

int main() {
  ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n;
  for (int i = 1, v, w; i <= n; i++) {
    cin >> v >> w;
    ind[v]++, ind[i]++;
    g[i].push_back({v, w}), g[v].push_back({i, w});
    id[i].push_back(i), id[v].push_back(i);
  }
  for (int i = 1; i <= n; i++) {
    (ind[i] == 1) && (q[++r] = i);
  }
  for (; l <= r; l++) {
    int x = q[l];
    vis[x] = 1;
    for (Pii i : g[x]) {
      --ind[i.first];
      (ind[i.first] == 1) && (q[++r] = i.first);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      D(i, 0);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i] && !v[i]) {
      S(i, 0);
      V();
      ans += val;
      val = tot = 0;
    }
  }
  cout << ans;
  return 0;
}
2024/3/24 21:11
加载中...