# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
850445 | 2023-09-16T14:54:13 Z | MinaRagy06 | Stranded Far From Home (BOI22_island) | C++17 | 0 ms | 0 KB |
#include <bits/stdc++.h> using namespace std; typedef int64_t ll; const int N = 200'005; bool in[N], bad[N]; vector<int> adj[N]; int main() { ios_base::sync_with_stdio(0), cin.tie(0); int n, m; cin >> n >> m; int a[n], b[n]; for (int i = 0; i < n; i++) { cin >> a[i]; b[i] = i; } sort(b, b + n, [&] (int i, int j) {return a[i] < a[j];}); reverse(b, b + n); for (int i = 0, u, v; i < m; i++) { cin >> u >> v; u--, v--; adj[u].push_back(v); adj[v].push_back(u); } int cnt = 0; int ans[n]{}; for (auto st : b) { if (bad[st]) { ans[st] = 0; continue; } for (int i = 0; i < n; i++) { in[i] = 0; } in[st] = 1; priority_queue<pair<int, int>> pq; for (auto nxt : adj[st]) { pq.push({-a[nxt], nxt}); } ll ttl = a[st]; while (pq.size()) { int cost = -pq.top().first; int node = pq.top().second; pq.pop(); if (in[node]) continue; if (ttl < cost) { break; } ttl += cost; in[node] = 1; for (auto nxt : adj[node]) { if (!in[nxt]) { pq.push({-a[nxt], nxt}); } } } int ok = 1; for (int i = 0; i < n; i++) { ok &= in[i]; } cnt += ok; if (!ok) { for (int i = 0; i < n; i++) { if (in[i]) { bad[i] = 1; } } } ans[st] = ok; } assert(cnt <= 100) for (auto i : ans) { cout << i; } cout << '\n'; return 0; }