Submission #879465

#TimeUsernameProblemLanguageResultExecution timeMemory
879465vladburacStranded Far From Home (BOI22_island)C++17
100 / 100
271 ms27216 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];

int findd( int x ) { // parintele si daca am marcat pe lant pana la radacina
  if( parent[x] == x )
    return x;
  int sef = findd( parent[x] );
  marked[x] |= marked[parent[x]];
  parent[x] = sef;
  return sef;
}

void unite( int a, int b, int newVal ) {
  int x = findd( a );
  int y = findd( b );
  if( sum[x] < newVal )
    marked[x] = true;
  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( vec, v[i].second, v[i].first );
    }
  }
  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;
}
#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...