제출 #1324511

#제출 시각아이디문제언어결과실행 시간메모리
1324511aaaaaaaaDžumbus (COCI19_dzumbus)C++20
0 / 110
18 ms8760 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxN = 2005;
const int inf = 5e18;
vector<int> adj[mxN];
int dp[mxN][mxN][2], tdp[mxN][2], sz[mxN], val[mxN];
void update(int par, int child){
    for(int i = 0; i <= sz[par] + sz[child]; ++i) tdp[i][0] = tdp[i][1] = inf;
    for(int i = 0; i <= sz[par]; ++i){
        for(int j = 0; j <= sz[child]; ++j){
            tdp[i + j][0] = min(tdp[i + j][0], dp[par][i][0] + min(dp[child][j][0], dp[child][j][1]));
            tdp[i + j][1] = min(tdp[i + j][1], dp[par][i][1] + min(dp[child][j][0], dp[child][j][1]));
            if(i + 1 <= sz[par]){
                tdp[i + j + 1][1] = min(tdp[i + j + 1][1], dp[par][i][0] + val[par] + dp[child][j][1]);
            }
            if(j + 1 <= sz[child]){
                tdp[i + j + 1][1] = min(tdp[i + j + 1][1], dp[par][i][1] + val[child] + dp[child][j][0]);
            }
            if(i + 1 <= sz[par] && j + 1 <= sz[child]){
                tdp[i + j + 2][1] = min(tdp[i + j + 2][1], dp[par][i][0] + dp[child][j][0] + val[child] + val[par]);
            }
        }
    }
    for(int i = 0; i <= sz[par] + sz[child]; ++i){
        for(int j = 0; j <= 1; ++j){
            dp[par][i][j] = tdp[i][j];
        }
    }
}
void dfs(int u = 1, int par = 0){
    sz[u] = 1;
    dp[u][0][0] = 0, dp[u][0][1] = inf, dp[u][1][0] = inf, dp[u][1][1] = inf;
    for(auto it : adj[u]){
        if(it ^ par){
            dfs(it, u);
        }
    }
    update(par, u);
    sz[par] += sz[u];
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    int n, m, q;
    cin >> n >> m;
		val[0] = inf;
    for(int i = 1; i <= n; ++i) cin >> val[i];
    for(int i = 1; i <= m; ++i){
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dp[0][0][0] = 0, dp[0][0][1] = inf, dp[0][1][0] = inf, dp[0][1][1] = inf;
    for(int i = 1; i <= n; ++i){
        if(!sz[i]) dfs(i, 0);
    }
    cin >> q;
    while(q--){
        int ans = 0, s;
        cin >> s;
        for(int k = n; k >= 0; --k){
            if(dp[0][k][0] > s) {
							continue;
            }else{
							ans = k;
							break;
						}
        }
        cout << ans << "\n";
    }
		return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...