Submission #1247170

#TimeUsernameProblemLanguageResultExecution timeMemory
1247170julia_08Džumbus (COCI19_dzumbus)C++20
110 / 110
34 ms25156 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 1e3 + 10; const ll INF = 1e18; int d[MAXN], marc[MAXN], sub[MAXN]; ll dp[MAXN][MAXN][3]; vector<int> adj[MAXN]; int n, m; void init(int v){ sub[v] = 1; for(int i=0; i<=n; i++) dp[v][i][0] = dp[v][i][1] = dp[v][i][2] = INF; dp[v][0][0] = 0; dp[v][0][2] = d[v]; } void merge(int u, int v){ for(int i=sub[v]; i>=0; i--){ for(int j=sub[u]; j>=0; j--){ dp[v][i + j][0] = min(dp[v][i + j][0], dp[v][i][0] + min({dp[u][j][0], dp[u][j][1], dp[u][j][2]})); dp[v][i + j][1] = min(dp[v][i + j][1], dp[v][i][1] + min({dp[u][j][0], dp[u][j][1], dp[u][j][2]})); dp[v][i + j + 1][1] = min(dp[v][i + j + 1][1], min(dp[v][i][1], dp[v][i][2]) + dp[u][j][2]); dp[v][i + j + 1][1] = min(dp[v][i + j + 1][1], dp[v][i][2] + min(dp[u][j][1], dp[u][j][2])); dp[v][i + j + 2][1] = min(dp[v][i + j + 2][1], dp[v][i][2] + dp[u][j][2]); dp[v][i + j][2] = min(dp[v][i + j][2], dp[v][i][2] + dp[u][j][0]); } } sub[v] += sub[u]; } void dfs(int v){ marc[v] = 1; init(v); for(auto u : adj[v]){ if(!marc[u]){ dfs(u); merge(u, v); } } } int main(){ cin.tie(0)->sync_with_stdio(0); cin >> n >> m; for(int i=1; i<=n; i++) cin >> d[i]; while(m--){ int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } vector<int> roots; for(int i=1; i<=n; i++){ if(!marc[i]){ adj[0].push_back(i); dfs(i); } } init(0); for(auto v : adj[0]) merge(v, 0); int q; cin >> q; for(int i=1; i<=q; i++){ int s; cin >> s; int l = 0, r = n; while(l < r){ int m = l + (r - l + 1) / 2; if(dp[0][m][0] <= s) l = m; else r = m - 1; } cout << l << "\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...