Submission #1158008

#TimeUsernameProblemLanguageResultExecution timeMemory
1158008LucaLucaMClosing Time (IOI23_closing)C++20
0 / 100
93 ms28860 KiB
#include "closing.h"

#include <iostream>
#include <algorithm>
#include <cassert>
#include <vector>

using ll = long long;

const int NMAX = 2e5;
const ll INF = 1e18;

std::vector<std::vector<std::pair<int, int>>> g;

void dfs(int u, int p, std::vector<ll> &d) {
  for (const auto &[v, c] : g[u])  {
    if (v != p) {
      d[v] = d[u] + c;
      dfs(v, u, d);
    }
  }  
}

int max_score(int n, int X, int Y, long long K,
              std::vector<int> U, std::vector<int> V, std::vector<int> W)
{
    g.clear();
    g.resize(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]});
    }

    std::vector<ll> dx(n, 0), dy(n, 0);

    dfs(X, -1, dx);
    dfs(Y, -1, dy);

    std::vector<ll> a(n), b(n);
    for (int i = 0; i < n; i++) {
      a[i] = std::min(dx[i], dy[i]);
      b[i] = std::max(dx[i], dy[i]);
    }

    // for (int i = 0; i < n; i++) {
    //   std::cout << a[i] << ' ' << b[i] << '\n';
    // }
    // std::cout << "\n\n";
    
    // sunt linie si am cel putin unu care apare de doua ori
    
    ll aux = K;

    for (int i = X + 1; i < Y; i++) {
      K -= a[i];
    }

    std::vector<int> upgrades;
    for (int i = 0; i < n; i++) {
      if (X < i && i < Y) {
        upgrades.push_back(b[i] - a[i]);
      } else {
        upgrades.push_back(a[i]);
      }
    }

    std::sort(upgrades.begin(), upgrades.end());

    int caz1 = Y - X - 1;
    if (K < 0) {
      caz1 = -1e9;
    }
    for (const auto &x : upgrades) {
      if (K >= x) {
        caz1++;
        K -= x;
      } else {
        break;
      }
    }

    upgrades.clear();
    for (int i = 0; i < n; i++) {
      upgrades.push_back(a[i]);
    }

    std::sort(upgrades.begin(), upgrades.end());

    int caz2 = 0;

    K = aux;

    for (const auto &x : upgrades) {
      if (K >= x) {
        caz2++;
        K -= x;
      }
    }

    return std::max(caz1, caz2);
  }
#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...