제출 #1203491

#제출 시각아이디문제언어결과실행 시간메모리
1203491AlgorithmWarriorStranded Far From Home (BOI22_island)C++20
0 / 100
185 ms14820 KiB
#include <bits/stdc++.h> using namespace std; int const MAX=200005; int n,m; int v[MAX]; vector<int>G[MAX]; int tata[MAX]; bool val[MAX]; int perm[MAX]; int sz[MAX]; bool crt(int a,int b){ if(v[a]!=v[b]) return v[a]<v[b]; return a<b; } void read(){ cin>>n>>m; int i; for(i=1;i<=n;++i) cin>>v[i]; for(i=1;i<=m;++i){ int u,v; cin>>u>>v; G[u].push_back(v); G[v].push_back(u); } } pair<int,bool>find_root(int nod){ if(nod==tata[nod]) return {nod,1}; pair<int,bool>ans=find_root(tata[nod]); val[nod]&=ans.second; tata[nod]=ans.first; return {tata[nod],val[nod]}; } void solve(){ int i; for(i=1;i<=n;++i) perm[i]=i; sort(perm+1,perm+n+1,crt); for(i=1;i<=n;++i){ int nod=perm[i]; tata[nod]=nod; val[nod]=1; sz[nod]=v[nod]; for(auto vec : G[nod]) if(crt(vec,nod)){ int root=find_root(vec).first; if(root!=nod){ if(sz[root]<v[nod]) val[root]=0; tata[root]=nod; sz[nod]+=sz[root]; } } } } void write(){ int i; for(i=1;i<=n;++i){ find_root(i); cout<<(val[i]&val[tata[i]]); } } int main() { read(); solve(); write(); 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...