Submission #966377

#TimeUsernameProblemLanguageResultExecution timeMemory
966377VMaksimoski008Closing Time (IOI23_closing)C++17
9 / 100
1093 ms30912 KiB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;

int n, x, y, k;
vector<vector<pair<int, int> >> graph;
const int maxn = 2e5 + 5;
using ll = long long;
ll dist[2][maxn];

void dfs(int u, int p, int t) {
    for(auto &[v, w] : graph[u]) {
        if(v == p) continue;
        dist[t][v] = dist[t][u] + w;
        dfs(v, u, 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) {
    n = N;
    x = X;
    y = Y;
    k = K;
    graph.resize(n);

    bool line = 1;
    for(int i=0; i<n-1; i++) {
        if(abs(U[i] - V[i]) != 1) line = 0;
        graph[U[i]].push_back({ V[i], W[i] });
        graph[V[i]].push_back({ U[i], W[i] });
    }

    if(line) {
        int ans = 0;
        dfs(x, x, 0);
        dfs(y, y, 1);

        for(int a=x; a<n; a++) {
            for(int b=x; b>=0; b--) {
                for(int c=y; c<n; c++) {
                    for(int d=y; d>=0; d--) {
                        ll total = 0;
                        for(int i=0; i<n; i++) {
                            ll curr = 0;
                            if(b <= i && i <= a) curr = max(curr, dist[0][i]);
                            if(d <= i && i <= c) curr = max(curr, dist[1][i]);
                            total += curr;
                        }

                        if(total <= k) ans = max(ans, a - b + c - d);
                    }
                }
            }
        }

        return ans + 2;
    }

    int ans = 0;
    ll total = 0;
    dfs(x, x, 0);
    dfs(y, y, 1);
    priority_queue<ll, vector<ll>, greater<ll> > pq;

    for(int i=0; i<2; i++)
        for(int j=0; j<n; j++) pq.push(dist[i][j]);

    while(!pq.empty() && pq.top() + total <= k) {
        ans++;
        total += pq.top();
        pq.pop();
    }

    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...