Submission #599372

#TimeUsernameProblemLanguageResultExecution timeMemory
599372fvogel499Stranded Far From Home (BOI22_island)C++17
100 / 100
295 ms46760 KiB
/*
 * File created on 07/19/2022 at 15:02:09.
 * Link to problem: 
 * Description: 
 * Time complexity: O()
 * Space complexity: O()
 * Status: ---
 * Copyright: Ⓒ 2022 Francois Vogel
*/

#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define pii pair<int, int>
#define f first
#define s second

#define vi vector<int>
#define all(x) x.begin(), x.end()
#define size(x) (int)((x).size())
#define pb push_back
#define ins insert
#define cls clear

#define int ll
#define ll long long
#define ld long double

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

const int siz = 2e5+40;

int par [siz];
int sum [siz];
vi el [siz];

int gp(int x) {
    if (par[x] == x) return x;
    return par[x] = gp(par[x]);
}

void merge(int x, int y) {
    x = gp(x);
    y = gp(y);
    if (x == y) return;
    if (size(el[x]) < size(el[y])) swap(x, y);
    par[y] = x;
    sum[x] += sum[y];
    for (int i : el[y]) el[x].pb(i);
}

signed main() {
    cin.tie(0);
    ios_base::sync_with_stdio(0);

    int n, nbE;
    cin >> n >> nbE;
    int val [n];
    for (int i = 0; i < n; i++) {
        cin >> val[i];
    }
    vi graph [n];
    for (int i = 0; i < nbE; i++) {
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        graph[a].pb(b);
        graph[b].pb(a);
    }
    vector<pii> sorted;
    for (int i = 0; i < n; i++) {
        sorted.pb({val[i], i});
    }
    sort(all(sorted));
    bool proc [n];
    for (int i = 0; i < n; i++) {
        proc[i] = false;
        par[i] = i;
        sum[i] = val[i];
        el[i] = {i};
    }
    int res [n];
    for (int i = 0; i < n; i++) {
        res[i] = 1;
    }
    for (pii i : sorted) {
        proc[i.s] = true;
        for (int j : graph[i.s]) if (proc[j]) {
            int x = gp(j);
            if (sum[x] < i.f) {
                for (int k : el[x]) {
                    res[k] = 0;
                }
                el[x].cls();
            }
        }
        for (int j : graph[i.s]) if (proc[j]) {
            merge(i.s, j);
        }
    }
    for (int i : res) {
        cout << i;
    }

    cout.flush();
    int d = 0;
    d++;
}
#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...