제출 #948190

#제출 시각아이디문제언어결과실행 시간메모리
948190amirhoseinfar1385Stranded Far From Home (BOI22_island)C++17
0 / 100
434 ms54088 KiB
#include<bits/stdc++.h> using namespace std; const int maxn=200000+10; vector<int>adj[maxn]; int all[maxn],n,m,dp[maxn],vis[maxn],mishe[maxn],mn[maxn]; struct cmp { bool operator() (int a, int b) const { if(all[a]==all[b]){ return a<b; } return all[a]<all[b]; } }; struct dsu{ int par[maxn],sum[maxn],mx[maxn]; set<int,cmp>st[maxn]; dsu(){ for(int i=0;i<maxn;i++){ par[i]=i; } } int root(int u){ if(u==par[u]){ return u; } return par[u]=root(par[u]); } void con(int u,int v){ int rootu=root(u),rootv=root(v); if(rootu!=rootv){ if((int)st[rootu].size()<(int)st[rootv].size()){ swap(rootu,rootv); } par[rootv]=rootu; sum[rootu]+=sum[rootv]; mx[rootu]=max(mx[rootu],mx[rootv]); for(auto x:st[rootv]){ st[rootu].insert(x); } while((int)st[rootu].size()>0&&mx[rootu]>=all[(*st[rootu].begin())]){ st[rootu].erase(*st[rootu].begin()); } } } long long porssum(int u){ int v=root(u); return sum[v]; } int porsy(int u){ int v=root(u); if((int)st[v].size()==0){ return -1; } return (*st[v].begin()); } }ds; void vorod(){ cin>>n>>m; all[0]=1e9+5; for(int i=1;i<=n;i++){ cin>>all[i]; ds.sum[i]=all[i]; ds.mx[i]=all[i]; } for(int i=0;i<m;i++){ int u,v; cin>>u>>v; //cout<<"ha "<<u<<" "<<v<<endl; ds.st[u].insert(v); ds.st[v].insert(u); adj[u].push_back(v); adj[v].push_back(u); } } void pre(){ vector<pair<int,int>>so; for(int i=1;i<=n;i++){ so.push_back(make_pair(all[i],i)); } sort(so.begin(),so.end()); vector<int>now; for(int i=0;i<n;i++){ if(i>0&&so[i].first!=so[i-1].first){ for(auto x:now){ dp[x]=ds.porssum(x); mn[x]=ds.porsy(x); } now.clear(); } int u=so[i].second; now.push_back(u); vis[u]=1; for(auto x:adj[u]){ if(vis[x]==1){ ds.con(x,u); } } } for(auto x:now){ dp[x]=ds.porssum(x); mn[x]=ds.porsy(x); } now.clear(); } void solve(){ vector<pair<int,int>>so; for(int i=1;i<=n;i++){ so.push_back(make_pair(all[i],i)); } sort(so.begin(),so.end()); for(int i=n-1;i>=0;i--){ int u=so[i].second; //cout<<u<<" "<<dp[u]<<" "<<mn[u]<<endl; if(all[u]==so.back().first){ mishe[u]=1; } if(mn[u]==-1||mishe[mn[u]]==0||dp[u]<all[mn[u]]){ mishe[u]|=0; }else{ mishe[u]|=1; } } for(int i=1;i<=n;i++){ cout<<mishe[i]; } cout<<"\n"; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("inp.txt","r",stdin); vorod(); pre(); solve(); }
#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...