Submission #966390

#TimeUsernameProblemLanguageResultExecution timeMemory
966390VMaksimoski008Closing Time (IOI23_closing)C++17
17 / 100
123 ms36904 KiB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;

int n, x, y;
long long 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 && n <= 50) {
        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 = k;
    dfs(x, x, 0);
    dfs(y, y, 1);
    
    vector<ll> v;
    for(int i=0; i<2; i++)
        for(int j=0; j<n; j++) v.push_back(dist[i][j]);
    sort(v.begin(), v.end());

    for(auto &x : v) {
        if(x > total) break;
        ans++;
        total -= x;
    }

    for(int i=0; i<n; i++) {
        graph[i].clear();
        for(int j=0; j<2; j++) dist[j][i] = 0;
    }

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