Submission #908407

#TimeUsernameProblemLanguageResultExecution timeMemory
908407duckindogBeads and wires (APIO14_beads)C++14
100 / 100
222 ms38264 KiB
// from duckindog wth depression
#include<bits/stdc++.h>

using namespace std;

#define int long long

const int N = 2e5 + 10;
int n;
vector<pair<int, int>> ad[N];
int f[2][N];
int pa[N];

void init_dfs(int u, int pre = 0) {

  int all = -1e15, none = -1e15;
  for (auto duck : ad[u]) {
    int v, w; tie(v, w) = duck;
    if (v == pre) continue;
    if (all == -1e15) all = 0;
    pa[v] = w;
    init_dfs(v, u);

    int best = max(f[1][v] + w, f[0][v]);

    all += best;
    none = max(none, f[0][v] + w - best);

  }

  f[0][u] = max(0ll, all);
  f[1][u] = all + none;

}

using pii = pair<int, int>;
int g[2][N];
void dfs(int u, int pre = 0) {

  vector<pii> best;
  int all = 0;

  for (auto duck : ad[u]) {
    int v, w; tie(v, w) = duck;
    if (v == pre) continue;

    best.push_back({v, w});
    all += max(f[1][v] + w, f[0][v]);
  }

  best.push_back({n + 1, -1e8});
  best.push_back({n + 1, -1e8});
  sort(best.begin(), best.end(), [&] (pii a, pii b) {
    int i, j; tie(i, j) = a;
    int t, l; tie(t, l) = b;
    return f[0][i] + j - max(f[0][i], f[1][i] + j) > f[0][t] + l - max(f[0][t], f[1][t] + l);
  });

  pii fi = best[0], se = best[1];


  for (auto duck : ad[u]) {
    int v, w; tie(v, w) = duck;
    if (v == pre) continue;

    int a, b; tie(a, b) = (v == fi.first ? se : fi);

    int sum = all - max(f[1][v] + w, f[0][v]);

    g[0][v] = max(g[0][v], sum - max(f[0][a], f[1][a] + b) + f[0][a] + b + g[0][u] + w);

    g[0][v] = max(g[0][v], max(g[0][u], g[1][u] + w) + sum);

    g[0][v] = max(g[0][v], f[0][u] - max(f[1][v] + w, f[0][v]));

    g[1][v] = f[0][u] - max(f[1][v] + w, f[0][v]) + g[0][u] + w;
    dfs(v, u);
  }


}

int32_t main() {
  cin.tie(0)->sync_with_stdio(0);

  if (fopen("duck.inp", "r")) {
    freopen("duck.inp", "r", stdin);
    freopen("duck.out", "w", stdout);
  }
  g[n + 1][0] = g[n + 1][1] = -1e8;
  cin >> n;
  for (int i = 1; i < n; ++i) {
    int u, v, w; cin >> u >> v >> w;
    ad[u].push_back({v, w});
    ad[v].push_back({u, w});
  }

  init_dfs(1);
  dfs(1);

  int answer = 0;
  for (int i = 1; i <= n; ++i) answer = max(answer, f[0][i] + g[0][i]);

  cout << answer;

}

Compilation message (stderr)

beads.cpp: In function 'int32_t main()':
beads.cpp:87:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |     freopen("duck.inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
beads.cpp:88:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |     freopen("duck.out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...