제출 #919693

#제출 시각아이디문제언어결과실행 시간메모리
919693vjudge1Stranded Far From Home (BOI22_island)C++17
100 / 100
244 ms47244 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,avx2,fma,popcnt") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> /* DEFINES */ #define S second #define F first #define ll long long #define ull unsigned long long #define ld long double #define npos ULLONG_MAX #define INF LLONG_MAX #define vv(a) vector<a> #define ss(a) set<a> #define pp(a, b) pair<a, b> #define mm(a, b) map<a, b> #define qq(a) queue<a> #define pq(a) priority_queue<a> #define ump(a, b) unordered_map<a, b> #define ANDROID \ ios_base::sync_with_stdio(0); \ cin.tie(0); \ cout.tie(0); #define allc(a) begin(a), end(a) #define all(a) a, a + sizeof(a) / sizeof(a[0]) #define elif else if #define endl "\n" #define pb push_back #define ins insert #define logi __lg #define sqrt sqrtl #define mpr make_pair using namespace std; using namespace __cxx11; using namespace __gnu_pbds; typedef char chr; typedef basic_string<chr> str; template <typename T, typename key = less<T>> using ordered_set = tree<T, null_type, key, rb_tree_tag, tree_order_statistics_node_update>; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll N = 2e5 + 5; ll b[N]; struct Dsu { ll n, ans; vv(ll) dsu, sum; vv(vv(ll)) s; Dsu(ll sz = 1) { n = sz; ans = n; dsu.resize(n + 1, 0); sum.resize(n + 1, 0); s.resize(n + 1); init(); } void init() { for (ll i = 1; i <= n; i++) dsu[i] = -1, s[i] = {i}; } bool Union(ll x, ll y) { x = repr(x), y = repr(y); if (x == y) return false; if (dsu[x] < dsu[y]) swap(x, y); ans--; for (ll i : s[x]) s[y].pb(i); s[x].clear(); dsu[y] += dsu[x]; sum[y] += sum[x]; dsu[x] = y; return true; } ll repr(ll x) { if (dsu[x] < 0) return x; return dsu[x] = repr(dsu[x]); } ll query() { return ans; } ll size(ll x) { return -dsu[repr(x)]; } }; void solve() { ll n, m; cin >> n >> m; pp(ll, ll) a[n + 1]; vv(ll) g[n + 1]; for (ll i = 1; i <= n; i++) cin >> a[i].F, a[i].S = i, b[i] = a[i].F; Dsu dsu(n); for (ll i = 1; i <= n; i++) dsu.sum[i] = b[i]; while (m--) { ll a, b; cin >> a >> b; g[a].pb(b); g[b].pb(a); } sort(a + 1, a + n + 1); ll ans[n + 1]; for (ll i = 1; i <= n; i++) ans[i] = 1; for (ll _ = 1; _ <= n; _++) for (ll i : {a[_].S}) for (ll j : g[i]) if (b[j] <= b[i]) { ll rprj = dsu.repr(j), rpri = dsu.repr(i); if (dsu.sum[rprj] < b[i]) { for (ll k : dsu.s[rprj]) ans[k] = 0; dsu.s[rprj].clear(); } dsu.Union(rprj, rpri); } for (ll i = 1; i <= n; i++) cout << ans[i]; cout << endl; } /* */ int main() { ANDROID // precomp(); ll t = 1; // cin >> t; for (ll i = 1; i <= t; i++) // cout << "Case #" << i << ": ", solve(); cerr << "\nTime elapsed : " << clock() * 1000.0 / CLOCKS_PER_SEC << " ms\n"; }
#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...