Submission #578151

#TimeUsernameProblemLanguageResultExecution timeMemory
5781518e7Stranded Far From Home (BOI22_island)C++17
100 / 100
983 ms94796 KiB
//Challenge: Accepted #include <bits/stdc++.h> #pragma GCC optimize("Ofast") using namespace std; #ifdef zisk void debug(){cout << endl;} template<class T, class ... U> void debug(T a, U ... b){cout << a << " ", debug(b...); } template<class T> void pary(T l, T r) { while (l != r) cout << *l << " ", l++; cout << endl; } #else #define debug(...) 0 #define pary(...) 0 #endif #define ll long long #define maxn 200005 #define maxc 31 #define pii pair<int, int> #define ff first #define ss second #define io ios_base::sync_with_stdio(0);cin.tie(0); const ll inf = 1LL<<30; vector<int> adj[maxn]; ll sum[maxc][maxn]; int mi[maxc][maxn], comp[maxc][maxn], smi[maxc][maxn]; int idx[maxc][maxn]; int w[maxn]; int lev[maxn]; bool vis[maxn], tv[maxn]; void dfs(int n, int id, int l) { vis[n] = 1; sum[l][id] += w[n]; comp[l][n] = id; for (int v:adj[n]) { if (!vis[v] && lev[v] < l) dfs(v, id, l); } } int main() { io int n, m; cin >> n >> m; ll tot = 0; for (int i = 1;i <= n;i++) cin >> w[i], tot += w[i]; for (int i = 0;i < m;i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } for (int i = 1;i <= n;i++) { ll tmp = w[i]; while (tmp >= 2) { lev[i]++; tmp >>= 1; } } for (int j = 0;j <= n;j++) mi[0][j] = smi[0][j] = inf; for (int i = 1;i < maxc;i++) { for (int j = 1;j <= n;j++) vis[j] = 0, mi[i][j] = smi[i][j] = inf; mi[i][0] = smi[i][0] = inf; int cnt = 1; for (int j = 1;j <= n;j++) { if (!vis[j] && lev[j] < i) { dfs(j, cnt, i); //debug(i, j, cnt, sum[i][c]); cnt++; } } for (int j = 1;j <= n;j++) { if (lev[j] >= i) { for (int k:adj[j]) { if (lev[k] < i) { int c = comp[i][k]; if (w[j] < mi[i][c]) { smi[i][c] = mi[i][c]; mi[i][c] = w[j]; idx[i][c] = j; } else { smi[i][c] = min(smi[i][c], (int)w[j]); } } } } } } string ans; for (int i = 1;i <= n;i++) { int cur = lev[i]; bool poss = 0, fi = 1; while (cur < maxc) { ll p = 0; int val = inf; if (fi) { fi = 0; p = w[i]; vector<int> v; for (int j:adj[i]) { if (lev[j] < cur && !tv[comp[cur][j]]) { int c = comp[cur][j]; tv[c] = 1; p += sum[cur][c]; v.push_back(c); if (idx[cur][c] == i) val = min(val, smi[cur][c]); else val = min(val, mi[cur][c]); } else if (lev[j] >= cur) { val = min(val, (int)w[j]); } } for (int j:v) tv[j] = 0; } else { val = min(val, mi[cur][comp[cur][i]]); } if (comp[cur][i]) p += sum[cur][comp[cur][i]]; //debug(cur, p, val); if (p == tot) { poss = 1; break; } else if (p < val) { break; } else { cur++; } } //debug(); if (poss) ans += '1'; else ans += '0'; } cout << ans << "\n"; } /* 5 4 7 10 1 5 9 1 2 3 5 3 4 4 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...
#Verdict Execution timeMemoryGrader output
Fetching results...