Submission #1166656

#TimeUsernameProblemLanguageResultExecution timeMemory
1166656dostsDžumbus (COCI19_dzumbus)C++20
50 / 110
144 ms14916 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]; } } 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); } dfs(1,1); int q; cin >> q; while (q--) { int b; cin >> b; for (int i = n;i>=0;i--) { if (min(dp[1][0][i],dp[1][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...