# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
879397 | vladburac | Stranded Far From Home (BOI22_island) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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] };
x = findd( parent[x] );
return { x.first, x.second | marked[x.first] };
}
void unite( int a, int b, int nxtWeight ) {
int x = findd( a );
int y = findd( b );
if( x != y ) {
parent[x] = y;
sum[y] += sum[x];
if( sum[y] < nxtWeight )
marked[y] = true;
}
}
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;
bool linked = false;
for( auto vec: edges[v[i].second] ) {
if( viz[vec] ) {
unite( v[i].second, vec, v[i+1].first );
linked = true;
}
}
if( !linked && v[i].first < v[i+1].first )
marked[v[i].second] = true;
}
for( i = 0; i < n; i++ )
a = findd( i );
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;
}