제출 #1320331

#제출 시각아이디문제언어결과실행 시간메모리
1320331888313666Stranded Far From Home (BOI22_island)C++20
0 / 100
89 ms22128 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define _ <<' '<< #define print(x) cout<<#x<<": "<<(x)<<'\n' int n,m; vector<vector<int>> adj; vector<ll> s; vector<int> res; vector<array<int, 2>> vis; vector<array<ll, 2>> srt; struct dsu{ int n; vector<int> par; vector<ll> sz; dsu(const int n) { this->n=n; par.resize(n); sz=s; iota(par.begin(), par.end(), 0); } int find(const int i) { if (par[i]==i) return i; return par[i]=find(par[i]); } ll size(const int i) { return sz[find(i)]; } bool unite(int i, int j) { i=find(i), j=find(j); if (i==j) return false; par[j]=i; sz[i]+=sz[j]; return true; } }; bool bfs(const int st) { priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> q; vector<int> vis(n, 0); ll cur=s[st]; for (const auto v:adj[st]) q.push({s[v], v}); vis[st]=1; while (!q.empty()) { const auto [d, u]=q.top(); q.pop(); if (vis[u]) continue; vis[u]=1; if (d>cur) return false; cur+=d; for (const auto v:adj[u]) if (!vis[v]) q.push({s[v], v}); } return true; } void dfs(const int u, int f) { vis[u][f]=1; f&=res[u]; res[u]=f; vis[u][f]=1; for (const auto v:adj[u]) if (!vis[v][f]) dfs(v, f); } int main(){ cin.tie(0)->sync_with_stdio(0); cout.tie(0); cin>>n>>m; adj.resize(n); s.resize(n); res.assign(n, 1); srt.resize(n); for (auto &e:s) cin>>e; for (int i=0; i<m; i++) { int a,b; cin>>a>>b; if (s[--a]>s[--b]) adj[a].push_back(b); else adj[b].push_back(a); } for (int i=0; i<n; i++) { srt[i][0]=s[i]; srt[i][1]=i; } sort(srt.begin(), srt.end()); int l=0, r=0, w=0; dsu f(n); while (l!=n) { w=srt[l][0]; while (r<n-1 && srt[r+1][0]==w) ++r; ++r; //cout<<l _ r<<'\n'; for (int i=l; i<r; ++i) { for (const auto v:adj[srt[i][1]]) f.unite(srt[i][1], v); } if (r==n) break; for (int i=l; i<r; i++) { //cout<<i _ r _ f.size(srt[i][1]) _ srt[r][0]<<'\n'; if (f.size(srt[i][1])<srt[r][0]) res[srt[i][1]]=0; } l=r; } vis.assign(n, {0,0}); dfs(srt.back()[1], 1); for (const auto e:res) cout<<e; cout<<'\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...