Submission #897669

#TimeUsernameProblemLanguageResultExecution timeMemory
897669ErJClosing Time (IOI23_closing)C++17
75 / 100
1121 ms2097152 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define vi vector<ll>
#define vvi vector<vector<ll>>
#define vs vector<string>
#define vc vector<char>
#define vb vector<bool>
#define vp vector<pair<ll, ll>>
#define pp pair<ll, ll>
#define qi queue<ll>
#define qp queue<pp>
#define pqi priority_queue<ll>
#define pqp priority_queue<pp>
#define mi map<ll, ll>
#define mpi map<pp, ll>
#define mip map<ll, pp>
#define mpp map<pp, pp>
#define mb map<ll, bool>
#define si set<ll>
#define sp set<pp>
#define mod 1000000007
#define rep(a, b) for(int a = 0; a < (b); a++)
#define rep2(a, b) for(int a = 1; a < (b); a++)
#define inf 1000000000000000000


int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int>  V, vector<int> W) {
    vector<ll> distX(N);
    vector<ll> distY(N);
    vector<ll> distXY(N);
    vector<ll> distXY2(N), distXY3(N);
    distX[X] = 0;
    distX[Y] = 0;
    vector<vp> edges(N);
    rep(i, U.size()) {
        edges[U[i]].push_back({ V[i], W[i] });
        edges[V[i]].push_back({ U[i], W[i] });
    }
    queue<int> q;
    vb was(N);
    rep(i, N) was[i] = false;
    q.push(X);
    vector<int> from(N);
    from[X] = -1;
    while (!q.empty()) {
        ll u = q.front();
        was[u] = true;
        q.pop();
        for (int i = 0; i < edges[u].size(); i++) {
            ll v = edges[u][i].first;
            ll dw = edges[u][i].second;
            if (!was[v]) {
                q.push(v);
                from[v] = u;
                distX[v] = distX[u] + dw;
            }
        }
    }
    rep(i, N) was[i] = false;
    queue<int> q2;
    q2.push(Y);
    while (!q2.empty()) {
        ll u = q2.front();
        was[u] = true;
        q2.pop();
        for (int i = 0; i < edges[u].size(); i++) {
            ll v = edges[u][i].first;
            ll dw = edges[u][i].second;
            if (!was[v]) {
                q2.push(v);
                distY[v] = distY[u] + dw;
            }
        }
    }
    vector<bool> mainLine(N);
    rep(i, N) mainLine[i] = false;
    int akt = Y;
    while (akt != -1) {
        mainLine[akt] = true;
        akt = from[akt];
    }

    for (int i = 0; i < N; i++) {
        distXY[i] = max(distX[i], distY[i]);
        distXY2[i] = min(distX[i], distY[i]);
        distXY3[i] = distXY2[i];
    }
    sort(distXY3.begin(), distXY3.end());
    ll anslvl1 = 0;
    ll sum = 0;
    rep(i, distXY3.size()) {
        sum += distXY3[i];
        if (sum <= K) {
            anslvl1++;
        }
    }  
    vvi dp(N + 1);
    dp[0].resize(2*N + 1);
    for (int i = 0; i < 2 * N + 1; i++) {
        dp[0][i] = inf;
    }
    dp[0][0] = 0;
    for (int i = 1; i < dp.size(); i++) {
        dp[i].resize(2 * N + 1);
        if (!mainLine[i-1]) {
            for (int j = 0; j < 2 * N + 1; j++) {
                dp[i][j] = dp[i - 1][j];
            }
        }
        else {
            for (int j = 0; j < 2 * N + 1; j++) {
                dp[i][j] = inf;
            }
        }
        for (int j = 0; j < 2 * N + 1; j++) {
            if (dp[i - 1][j] != inf) {
                dp[i][j + 1] = min(dp[i][j + 1], dp[i - 1][j] + distXY2[i - 1]);
                dp[i][j + 2] = min(dp[i][j + 2], dp[i - 1][j] + distXY[i - 1]);
            }
        }
    }
    ll ans = 0;
    for (int i = 2 * N; i >= 0; i--) {
        if (dp[N][i] <= K) {
            ans = i;
            break;
        }
    }
    return max(ans, anslvl1);
}

Compilation message (stderr)

closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:24:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 | #define rep(a, b) for(int a = 0; a < (b); a++)
      |                                    ^
closing.cpp:37:5: note: in expansion of macro 'rep'
   37 |     rep(i, U.size()) {
      |     ^~~
closing.cpp:51:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |         for (int i = 0; i < edges[u].size(); i++) {
      |                         ~~^~~~~~~~~~~~~~~~~
closing.cpp:68:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         for (int i = 0; i < edges[u].size(); i++) {
      |                         ~~^~~~~~~~~~~~~~~~~
closing.cpp:24:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 | #define rep(a, b) for(int a = 0; a < (b); a++)
      |                                    ^
closing.cpp:93:5: note: in expansion of macro 'rep'
   93 |     rep(i, distXY3.size()) {
      |     ^~~
closing.cpp:105:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |     for (int i = 1; i < dp.size(); i++) {
      |                     ~~^~~~~~~~~~~
#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...