Submission #1097326

#TimeUsernameProblemLanguageResultExecution timeMemory
1097326hickwhitherDžumbus (COCI19_dzumbus)C++17
110 / 110
201 ms80560 KiB
#include <iostream> #include <vector> #include <cstring> using namespace std; #define int int64_t // fuck my self const int INF = 1e18+7; const int MAXN = 2222; int n, m, q; struct Edge { int u, v; Edge(){} Edge(int _u, int _v): u(_u), v(_v) {} int other(const int x){return x^u^v;} } edge[MAXN] ; vector<int> e[MAXN]; int s[MAXN]; #define minimize(a,b) a=min(a,b) int64_t f[MAXN]; int64_t dp[MAXN][MAXN][2]; int64_t lst[MAXN][2]; int sz[MAXN]; void dfs(int u=1, int p=-1){ sz[u] = 1; dp[u][0][0] = 0; for(int &v: e[u]){ if(v==p) continue; dfs(v, u); for(int i=0; i<=sz[u]; ++i) lst[i][0] = dp[u][i][0], lst[i][1] = dp[u][i][1]; for(int U=0; U<=sz[u]; ++U){ for(int V=0; V<=sz[v]&&U+V<=n; ++V){ minimize(dp[u][U+V][0], lst[U][0] + dp[v][V][0]); minimize(dp[u][U+V][0], lst[U][0] + dp[v][V][1]); if(u==0)continue; minimize(dp[u][U+V][1], lst[U][1] + dp[v][V][0]); minimize(dp[u][U+V][1], lst[U][1] + dp[v][V][1]); minimize(dp[u][U+V+1][1], lst[U][0] + dp[v][V][1] + s[u]); // u off minimize(dp[u][U+V+1][1], lst[U][1] + dp[v][V][0] + s[v]); // v off minimize(dp[u][U+V+2][1], lst[U][0] + dp[v][V][0] + s[u] + s[v]); // both off }} sz[u]=min(sz[u]+sz[v],n); } } bool vis[MAXN]; void bfs_beo(int u){ vis[u] = 1; for(int &v : e[u])if(!vis[v]) bfs_beo(v); } signed main() { cin.tie(0) -> sync_with_stdio(0); cin >> n >> m; for(int i=1; i<=n; ++i) cin >> s[i]; for(int u, v, i=0; i<m; ++i){ cin >> u >> v; e[u].emplace_back(v); e[v].emplace_back(u); } for(int i=1; i<=n; ++i){ if(!vis[i]){ e[0].emplace_back(i); e[i].emplace_back(0); bfs_beo(i); } } memset(dp, 0x3f, sizeof(dp)); dfs(0); // cout << "***\n"; // for(int i=0; i<=n; ++i){ // cout << i << "**\n"; // for(int j=0; j<=n; ++j) cout << (dp[i][j][0]>=INF ? -1 : dp[i][j][0]) << ' '; cout << '\n'; // for(int j=0; j<=n; ++j) cout << (dp[i][j][1]>=INF ? -1 : dp[i][j][1]) << ' '; cout << '\n'; // cout << '\n'; // } cin >> q; while(q--){ int x;cin >> x; bool fl = 1; for(int i=n; i>=0; --i) if(dp[0][i][0]<=x || dp[0][i][1]<=x){ cout << i << '\n'; fl = 0; break; } } return 0; }

Compilation message (stderr)

dzumbus.cpp: In function 'int main()':
dzumbus.cpp:107:14: warning: variable 'fl' set but not used [-Wunused-but-set-variable]
  107 |         bool fl = 1;
      |              ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...