Submission #1166660

#TimeUsernameProblemLanguageResultExecution timeMemory
1166660dostsDžumbus (COCI19_dzumbus)C++20
110 / 110
145 ms15172 KiB
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define all(x) x.begin(),x.end()
#define sp << " " << 
using namespace std;

const int N = 10001,MOD = 998244353,inf = 1e18;

vi sz(N,0),c(N),d(N);
vi edges[N];
vi dp[N][3];
void dfs(int node,int p) {
    sz[node] = 1;
    dp[node][0] = {0,inf};
    dp[node][1] = {c[node],inf};
    dp[node][2] = {inf,inf};
    for (auto it : edges[node]) {
        if (it == p) continue;
        dfs(it,node);
        while (dp[node][0].size() < sz[node]+sz[it]+1) dp[node][0].push_back(inf);
        while (dp[node][1].size() < sz[node]+sz[it]+1) dp[node][1].push_back(inf);
        while (dp[node][2].size() < sz[node]+sz[it]+1) dp[node][2].push_back(inf);
        vi dp0 = dp[node][0],dp1 = dp[node][1], dp2 = dp[node][2];
        for (int j = 0;j<=sz[node];j++) {
            for (int k = 0;k<=sz[it];k++) {
                dp[node][0][j+k] = min(dp[node][0][j+k],dp0[j]+min({dp[it][0][k],dp[it][1][k],dp[it][2][k]}));
                dp[node][1][j+k] = min(dp[node][1][j+k],dp1[j]+min({dp[it][0][k],dp[it][1][k],dp[it][2][k]}));
                dp[node][2][j+k] = min(dp[node][2][j+k],dp2[j]+min({dp[it][0][k],dp[it][1][k],dp[it][2][k]}));
                if (j+k+2 <= sz[node]+sz[it]) {
                    dp[node][2][j+k+2] = min(dp[node][2][j+k+2],dp1[j]+dp[it][1][k]);
                }
                if (j+k+1 <= sz[node]+sz[it]) {
                    dp[node][2][j+k+1] = min(dp[node][2][j+k+1],dp1[j]+dp[it][2][k]);
                    dp[node][2][j+k+1] = min(dp[node][2][j+k+1],dp2[j]+dp[it][1][k]);
                }
            }
        }
        dp[it][0].clear();
        dp[it][1].clear();
        dp[it][2].clear();
        sz[node]+=sz[it];
    }
}

vi vis(N,0);

void bullshit(int node) {
    if (vis[node]) return;
    vis[node] = 1;
    for (auto it : edges[node]) bullshit(it);
}
void solve() {
    int n,m;
    cin >> n >> m;
    for (int i=1;i<=n;i++) cin >> c[i];
    for (int i=1;i<=m;i++) {
        int a,b;
        cin >> a >> b;
        edges[a].push_back(b);
        edges[b].push_back(a);
    }
    c[0] = inf;
    for (int i=1;i<=n;i++) {
        if (!vis[i]) {
            bullshit(i);
            edges[0].push_back(i);
        }
    }
    dfs(0,0);
    int q;
    cin >> q;
    while (q--) {
        int b;
        cin >> b;
        for (int i = n;i>=0;i--) {
            if (min(dp[0][0][i],dp[0][2][i])<= b) {
                cout << i << '\n';
                break;
            }
        }
    }
}

signed main() {
    ios_base::sync_with_stdio(0);cin.tie(0);
    #ifdef Dodi
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...