제출 #1121676

#제출 시각아이디문제언어결과실행 시간메모리
1121676vjudge1Stranded Far From Home (BOI22_island)C++17
100 / 100
177 ms34744 KiB
// Bolatulu #include <bits/stdc++.h> // #include <art.h> /* #pragma GCC target ("avx2") #pragma GCC optimization ("O3") #pragma GCC optimization ("unroll-loops") */ typedef long long ll; typedef unsigned long long ull; typedef double db; #define pb push_back #define eb emplace_back #define ins insert #define F first #define S second #define md (tl+tr)/2 #define TL v+v,tl,md #define TR v+v+1,md+1,tr #define Tl t[v].l,tl,md #define Tr t[v].r,md+1,tr #define all(x) (x).begin(),(x).end() #define yes cout << "YES\n" #define no cout << "NO\n" #define int long long // #define file(s) freopen(s".in", "r", stdin); freopen(s".out", "w", stdout); using namespace std; int binpow(int a,int n,int M) { if (n==0) return 1; if (n%2!=0) return (a * binpow(a,n-1,M))%M; int z=binpow(a,n/2,M); return (z*z)%M; } const ll INF = 1e18+7; const int N = 2e5+7; int n,m,s[N],sz[N],p[N],ans[N],nxt[N],mx[N],pos[N],sum[N]; vector <int> g[N]; int mxs=0; int find(int v) { if (p[v]==v) return v; return p[v]=find(p[v]); } void unite(int u,int v) { u=find(u), v=find(v); if (u==v) return; if (sz[u]<sz[v]) swap(u,v); p[v]=u; sz[u]+=sz[v]; sum[u]+=sum[v]; } bool u[N]; void check(int v) { u[v]=true; for (auto to : g[v]) { if (!u[to]) check(to); } } void dfs(int v) { u[v]=true; if (s[v]==mxs) { ans[v]=1; } else if (nxt[v]) { if (!u[nxt[v]]) dfs(nxt[v]); ans[v]=ans[nxt[v]]; } } void solve() { cin >> n >> m; vector <pair <int,int>> v; for (int i=1;i<=n;i++) { cin >> s[i]; mxs=max(mxs,s[i]); v.eb(s[i],i); p[i]=pos[i]=i; mx[i]=sum[i]=s[i]; sz[i]=1; } sort(all(v)); while (m--) { int u,v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } check(1); bool ok=true; for (int i=1;i<=n;i++) { if (!u[i]) ok=false; u[i]=false; } if (!ok) { for (int i=1;i<=n;i++) cout << 0; return; } for (int i=0;i<n;i++) { int x=v[i].S; for (auto to : g[x]) { if ((s[to]<s[x] or (s[to]==s[x] and to<x)) and find(x)!=find(to)) { to=find(to); if (sum[to]>=s[x]) { nxt[pos[to]]=x; } unite(x,to); mx[find(x)]=s[x]; pos[find(x)]=x; } } } for (int i=1;i<=n;i++) { if (!u[i]) dfs(i); } for (int i=1;i<=n;i++) { // cout << nxt[i] << '\n'; cout << ans[i]; } } signed main() { // file("jenga"); ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); int test = 1; // cin >> test; while (test--) { solve(); if (test) cout << '\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...