Submission #1279779

#TimeUsernameProblemLanguageResultExecution timeMemory
1279779wonderfulStranded Far From Home (BOI22_island)C++20
0 / 100
13 ms604 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MASK(i) (1ULL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() template<class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b){ a = b; return true; } return false; } template<class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b){ a = b; return true; } return false; } const ll INF = 1e18; int n, m; ll t[1000005]; vector<int> adj[1000005]; pair<int,int> edges[1000005]; bool vis[1000005]; int par[1000005]; int mark[1000005]; int cur, root; int child[1000005]; bool vis1[1000005]; vector<int> tree1[1000005], tree2[1000005]; bool cmp(pair<int,int> a, pair<int,int> b){ return max(t[a.first], t[a.second]) < max(t[b.first], t[b.second]); } void predfs(int u){ vis[u] = true; for (auto v : adj[u]){ if (!vis[v]) predfs(v); } } int findSet(int u){ if (par[u] == u) return u; return par[u] = findSet(par[u]); } void join(int u, int v, int val){ u = findSet(u); v = findSet(v); if (u == v) return; cur++; root = cur; mark[cur] = val; par[u] = par[v] = cur; tree1[cur].push_back(u); tree1[cur].push_back(v); } void dfs(int u){ if (u <= n){ child[u] = t[u]; return; } for (auto v : tree1[u]){ dfs(v); child[u] += child[v]; if (child[v] >= mark[u]){ tree2[u].push_back(v); } } } void dfs1(int u){ vis1[u] = true; for (auto v : tree2[u]){ dfs1(v); } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 1; i <= n; i++) cin >> t[i]; for (int i = 1; i <= m; i++){ int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); edges[i] = {u, v}; } predfs(1); for (int i = 1; i <= n; i++){ if (!vis[i]){ for (int j = 1; j <= n; j++) cout << 0; return 0; } } sort(edges + 1, edges + 1 + m, cmp); cur = n; for (int i = 1; i <= 3 * n; i++) par[i] = i; for (int i = 1; i <= m; i++){ join(edges[i].first, edges[i].second, max(t[edges[i].first], t[edges[i].second])); } dfs(root); dfs1(root); string res; for (int i = 1; i <= n; i++){ res.push_back(vis1[i] ? '1' : '0'); } cout << res << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...