Submission #879438

#TimeUsernameProblemLanguageResultExecution timeMemory
879438vladburacStranded Far From Home (BOI22_island)C++17
0 / 100
1079 ms21012 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int NMAX = 2e5; pair<int, int> v[NMAX+1]; vector <int> edges[NMAX+1]; int parent[NMAX+1]; bool viz[NMAX+1]; int marked[NMAX+1]; ll sum[NMAX+1]; pair<int, bool> findd( int x ) { // parintele si daca am marcat pe lant pana la radacina if( parent[x] == x ) return { x, marked[x] }; pair<int, bool> y = findd( parent[x] ); return { y.first, y.second | marked[y.first] }; } void unite( int a, int b ) { int x = findd( a ).first; int y = findd( b ).first; if( x != y ) { parent[x] = y; sum[y] += sum[x]; } } void solve() { int n, m, i, a, b; cin >> n >> m; for( i = 0; i < n; i++ ) { cin >> v[i].first; v[i].second = i; parent[i] = i; viz[i] = false; sum[i] = v[i].first; } v[n].first = 0; for( i = 0; i < m; i++ ) { cin >> a >> b; a--, b--; edges[a].push_back( b ); edges[b].push_back( a ); } sort( v, v + n ); for( i = 0; i < n; i++ ) { viz[v[i].second] = true; for( auto vec: edges[v[i].second] ) { if( viz[vec] ) unite( v[i].second, vec ); } int comp = findd( v[i].second ).first; if( sum[comp] < v[i+1].first ) marked[comp] = true; } for( i = 0; i < n; i++ ) a = findd( i ).first; for( i = 0; i < n; i++ ) cout << 1 - marked[i]; cout << "\n"; } int main() { //ios_base::sync_with_stdio( false ); //cin.tie( NULL ); //cout.tie( NULL ); int t = 1; //cin >> t; while( t-- ) solve(); 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...