제출 #1341376

#제출 시각아이디문제언어결과실행 시간메모리
1341376GoBananas69봉쇄 시간 (IOI23_closing)C++20
8 / 100
106 ms33996 KiB
#include <algorithm>
#include <cmath>
#include <iostream>
#include <queue>
#include <set>
#include <string>
#include <vector>
#include <map>
typedef long long ll;
using namespace std;

vector<vector<pair<int, ll>>> adj;
void dfs(int u, int p, vector<ll> &dist) {
    for (auto &e : adj[u]) {
        int v = e.first;
        ll w = e.second;
        if (v == p) continue;
        dist[v] = dist[u] + w;
        dfs(v, u, dist);
    }
}

int max_score(int n, int x, int y, ll k, vector<int> U, vector<int> V, vector<int> W) {
    adj.assign(n, {});
    vector<ll> distX(n, 0), distY(n, 0);
    for (int i = 0; i < n - 1; ++i) {
        int u = U[i], v = V[i];
        ll w = W[i];
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }
    if (x > y) swap(x, y);
    dfs(x, -1, distX);
    dfs(y, -1, distY);
    vector<ll> dist(n);
    for (int i = 0; i < n; ++i) dist[i] = min(distX[i], distY[i]);
    for (int i = 0; i < n; ++i) dist[i] = min(distX[i], distY[i]);

    sort(dist.begin(), dist.end());
    int score = 0;
    for (int i = 0; i < n; ++i) {
        if (k < dist[i]) break;
        k -= dist[i];
        score++;
    }

    return score;
}
#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...