제출 #1331500

#제출 시각아이디문제언어결과실행 시간메모리
1331500nicolo_010봉쇄 시간 (IOI23_closing)C++20
0 / 100
1094 ms24524 KiB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;

vector<vector<pii>> adj;

void dfs(int u, vector<ll> &dis, int p=-1, ll w=0) {
    dis[u] = w;
    for (auto [v, pe] : adj[u]) {
        if (v==p) continue;
        dfs(v, dis, u, w+pe);
    }
}

int max_score(int n, int x, int y, long long k,
              std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    adj.assign(n, {});
    vector<ll> disX(n, 0);
    vector<ll> disY(n, 0);
    for (int i=0; i<n-1; i++) {
        int u = U[i];
        int v = V[i];
        int w = W[i];
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }
    dfs(x, disX);
    dfs(y, disY);
    //Fijar [l, r] que me expando en X, expandir Y greedily
    int res=0;
    for (int l=0; l<=x; l++) {
        for (int r=n-1; r>=x; r--) {
            ll mx=k;
            vector<bool> vis(n, false);
            for (int i=l; i<=r; i++) {
                vis[i] = true;
                mx -= disX[i];
            }
            //cout << l << " " << r << " " << mx << endl;
            if (mx<0) continue;
            vector<ll> cost(n, 0);
            for (int i=0; i<n; i++) {
                if (vis[i]) {
                    if (disX[i] >= disY[i]) {
                        cost[i] = 0;
                    }
                    else {
                        cost[i] = disY[i]-disX[i];
                    }
                }
                else {
                    cost[i] = disY[i];
                }
            }
            vector<ll> acc(n, 0);
            acc[y] = 0;
            for (int i=y-1; i>=0; i--) {
                acc[i] = acc[i+1] + cost[i];
            }
            for (int i=y+1; i<n; i++) {
                acc[i] = acc[i-1]+cost[i];
            }
            sort(acc.begin(), acc.end());
            int ans = r-l+1;
            for (auto val : acc) {
                if (val <= mx) {
                    mx -= val;
                    ans++;
                }
            }
            res = max(res, ans);
        }
    }
    return res;
}
#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...