제출 #1240937

#제출 시각아이디문제언어결과실행 시간메모리
1240937bangan봉쇄 시간 (IOI23_closing)C++20
8 / 100
68 ms23108 KiB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define eb emplace_back
#define ALL(a) a.begin(), a.end()

#define ll long long
#define MP make_pair
#define MT make_tuple
#define pii pair<int, int>
#define Info tuple<ll, int, int>

const ll INF = 1ll << 50;

int none(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    vector<vector<pii>> adj(N);
    for (int i=0; i < N-1; i++) {
        adj[V[i]].eb(U[i], W[i]);
        adj[U[i]].eb(V[i], W[i]);
    }

    vector<array<bool, 2>> done(N);
    vector<array<ll, 2>> d(N, {INF, INF});
    d[X][0] = 0;
    d[Y][1] = 0;
    priority_queue<Info, vector<Info>, greater<Info>> pq;
    pq.emplace(0, X, 0);
    pq.emplace(0, Y, 1);
    int ans = 0;

    while (!pq.empty()) {
        auto [_, v, s] = pq.top();
        cerr << "(v, s) = " << v << ' ' << s << endl;
        pq.pop();
        if (done[v][s]) continue;
        done[v][s] = true;
        if (d[v][s] <= K) ans++, K -= d[v][s];
        else break;
        
        for (auto [u, w] : adj[v]) {
            ll new_d = d[v][s]+w;
            if (done[u][s^1]) new_d = max(new_d - d[u][s^1], 0ll);
            if (new_d < d[u][s]) {
                d[u][s] = new_d;
                pq.push(MT(d[u][s], u, s));
            }
        }

        // auto [_, v] = pq.top();
        // pq.pop();
        // if (done[v]) continue;
        // done[v] = true;
        // if (d[v] <= K) {
        //     ans++;
        //     K -= d[v];
        // }
        // for (auto [u, w] : adj[v]) if (d[v]+w < d[u]) {
        //     d[u] = d[v]+w;
        //     pq.push(MP(d[u], u));
        // }
    }
    return ans;
}

int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    return none(N, X, Y, K, U, V, W);
}
#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...