Submission #714794

#TimeUsernameProblemLanguageResultExecution timeMemory
714794ToxtaqStranded Far From Home (BOI22_island)C++17
20 / 100
1087 ms306612 KiB
#include <bits/stdc++.h> using namespace std; vector<vector<int>>g; vector<int>num; vector<long long>cnt1; vector<int>canTraverse; /// 0-unchecked, 1-false, 2-true void calc(int u, int par){ cnt1[u] = num[u]; for(int v : g[u]){ if(v != par){ calc(v, u); cnt1[u] += cnt1[v]; } } } void dfs1(int u, int par){ if(canTraverse[par] == 1)canTraverse[u] = 1; else{ canTraverse[u] = (cnt1[u] >= num[par]) + 1; } for(int v : g[u]){ if(v != par){ dfs1(v, u); } } } vector<bool>vis, chosen; bool cmp(int a, int b){ return num[a] < num[b]; } long long cnt = 0; vector<int>tmp; void dfs(int u){ vis[u] = 1; vector<int>tempo; for(int v : g[u]){ if(!chosen[v] && cnt >= num[v]){ cnt += num[v]; chosen[v] = 1; tempo.push_back(v); } else if(cnt < num[v]){ tmp.push_back(v); } } for(int v : tempo){ if(!vis[v]){ dfs(v); } } } int main() { int n, m; cin >> n >> m; num.resize(n + 1); g.resize(n + 1); vis.resize(n + 1); chosen.resize(n + 1); cnt1.resize(n + 1); canTraverse.resize(n + 1); for(int i = 1;i <= n;++i)cin >> num[i]; bool check = 1; for(int i = 0;i < m;++i){ int u, v; cin >> u >> v; if(abs(u - v) > 1)check = 0; g[u].push_back(v); g[v].push_back(u); } if(n <= 2000 && m <= 2000){ for(int i = 1;i <= n;++i){ sort(g[i].begin(), g[i].end(), cmp); } string s = ""; for(int i = 1;i <= n;++i){ cnt = num[i]; chosen[i] = 1; dfs(i); sort(tmp.begin(), tmp.end(), cmp); int ind = 0; while(tmp.size() && ind < tmp.size()){ int j = tmp[ind]; if(!chosen[j] && cnt >= num[j]){ chosen[j] = 1; cnt += num[j]; dfs(j); } else{ ind++; continue; } sort(tmp.begin(), tmp.end(), cmp); ind = 0; } bool ok = 1; for(int j = 1;j <= n && ok;++j){ if(!vis[j]){ ok = 0; } } for(int j = 1;j <= n;++j){ vis[j] = 0; chosen[j] = 0; } if(ok)s += '1'; else s += '0'; tmp.clear(); } cout << s; } else if(check){ int root = -1, mx = 0; for(int i = 1;i <= n;++i){ if(mx < num[i]){ mx = num[i]; root = i; } } calc(root, root); dfs1(root, root); for(int i = 1;i <= n;++i){ if(canTraverse[i] == 2)cout << 1; else cout << 0; } } else{ calc(1, 1); dfs1(1, 1); for(int i = 1;i <= n;++i){ if(canTraverse[i] == 2)cout << 1; else cout << 0; } } }

Compilation message (stderr)

island.cpp: In function 'int main()':
island.cpp:82:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |             while(tmp.size() && ind < tmp.size()){
      |                                 ~~~~^~~~~~~~~~~~
#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...