Submission #1037946

#TimeUsernameProblemLanguageResultExecution timeMemory
1037946errayClosing Time (IOI23_closing)C++17
75 / 100
1081 ms37056 KiB
#include "closing.h"

#include <vector>


#include <bits/stdc++.h>

using namespace std;

#ifdef DEBUG 
  #include "/home/ioi/egoi2024/d2/debug.h"
#else 
  #define debug(...) void(37)
#endif

template<typename T>
using min_pq = priority_queue<T, vector<T>, greater<T>>;

int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
  vector<vector<array<int, 2>>> g(N);
  for (int i = 0; i < N - 1; ++i) {
    g[U[i]].push_back({V[i], W[i]});
    g[V[i]].push_back({U[i], W[i]});
  }
  constexpr int64_t inf = int64_t(1E16);
  auto Sp = [&](int source) {
    vector<int64_t> dist(N, inf);
    min_pq<pair<int64_t, int>> pq;
    auto Add = [&](int v, int64_t d) {
      if (dist[v] > d) {
        dist[v] = d;
        pq.emplace(d, v);
      }
    };
    Add(source, 0);
    while (!pq.empty()) {
      auto[d, v] = pq.top(); pq.pop();
      if (dist[v] < d) continue;
      for (auto[u, w] : g[v]) {
        Add(u, d + w);
      }
    }
    return dist;
  };
  auto dx = Sp(X);
  auto dy = Sp(Y);
  int ans = 0;
  { //disjoint case
    auto all = dx;
    all.insert(all.end(), dy.begin(), dy.end());
    sort(all.begin(), all.end());
    int64_t tot = 0;
    for (auto x : all) {
      tot += x;
      if (tot <= K) ans++;
    }
  }
  debug(ans);
  map<int64_t, vector<int64_t>> groups;
  for (int i = 0; i < N; ++i) {
    groups[dx[i] - dy[i]].push_back(min(dx[i], dy[i]));
  }
  debug(groups);
  int64_t start_cost = 0, chain_s = 0;
  for (auto&[x, v] : groups) {
    sort(v.begin(), v.end());
    chain_s++;
    start_cost += v[0];
  }
  vector<int64_t> best(1, 0);
  for (auto[x, v] : groups) {
    int64_t diff = abs(x);
    int s = int(v.size());    
    int bs = int(best.size());
    auto new_best = best;
    new_best.resize(bs + 2 * s, inf);
    int seconds = 0, p = 0;
    int64_t cost = 0;
    debug(x, v);
    for (int t = 1; t <= 2 * s; ++t) {
      if (t == 1) {
        seconds++; p++;
      } else if (p == s || (seconds > 0 && v[p] > diff)) {
        seconds--;
        cost += diff;
      } else {
        cost += v[p++];
        seconds++;
      }
      debug(t, cost);
      for (int i = 0; i < bs; ++i) {
        new_best[i + t] = min(new_best[i + t], best[i] + cost);
      }      
    }
    swap(best, new_best);
  }
  debug(best, start_cost);
  for (int i = 0; i < int(best.size()); ++i) {
    if (best[i] + start_cost <= K) {
      ans = max(ans, i);
    }
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...