Submission #1305606

#TimeUsernameProblemLanguageResultExecution timeMemory
1305606AzeTurk810Stranded Far From Home (BOI22_island)C++20
0 / 100
116 ms28152 KiB
/*
Telebe of Adicto && Mamedov yani AzeTurk810
I see humans but no humanity
*/
#include <algorithm>
#include <cassert>
#include <functional>
#include <iostream>
#include <queue>
#include <set>
#include <utility>
#include <vector>

//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

using ll = long long;
using namespace std;

#define ln '\n'
#define INFi 1e9
#define INFll 1e18
#define int ll

#ifdef ONPC
    #include<algo.hpp>
#else
    #define dbg(...)
#endif

vector< int > ans;

struct DSU {
    vector<int> par , sum;
    vector< vector< int > > nodes;
    int n , components;
    bool can;

    DSU(int _n) {
        n = _n;
        components = n;
        par.assign(n , -1);
        sum.assign(n , -1);
        nodes.resize(n);
    }

    int Find(int u) {
        if(par[u] < 0 ) {
            can = ans[u];
            return u;
        }
        par[u] = Find(par[u]);
        ans[u] = ans[u] & can;
        can &= ans[u];
        return par[u];
    }

    bool Union(int u , int v) {
        u = Find(u);
        v = Find(v);
        if(u != v) {
            components--;
            if(par[u] > par[v]) {
                par[v] += par[u];
                par[u] = v;
                sum[v] += sum[u];
                return true;
            }
            par[u] += par[v];
            par[v] = u;
            sum[u] += sum[v];
            return true;
        } else {
            return false;
        }
    }
};

char solve() {
    int N , M;
    if(!(cin >> N >> M))
        return 1;
    vector< int > S(N + 1) , used(N + 1 , false);
    DSU t(N + 1);
    for(int i = 1;i <= N;i++)  {
        cin >> S[i];
        t.sum[i] = S[i];
    }
    vector< vector< int > > g(N + 1);
    for(int i = 0;i < M;i++) {
        int u , v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    vector< pair< int , int > > nums;
    for(int i = 1;i <= N;i++) {
        nums.push_back(make_pair(S[i], i));
    }
    sort(nums.begin() , nums.end());
    // nums[0] = {-1 , -1};
    // reverse(nums.begin() + 1 , nums.end());
    ans.assign(N + 1 , 1);
    assert(nums.size() == N);
    for(const auto &[sz , v] : nums) {
        if(v == -1)
            continue;
        used[v] = true;
        for(const auto u : g[v]) {
            if(!used[u])
                continue;
            // cerr << v << ':' << u << endl;
            if(S[u] < S[v]) {
                int k = t.Find(u);
                if(t.sum[k] < S[v]) {
                    // cerr << k << '|' << v << endl;
                    ans[k] = false; 
                }
            }
            t.Union(v, u);
        }
    }
    // cerr << t.sum[t.Find(4)] << ln;
    for(int i = 1;i <= N;i++) {
        t.Find(i);
        cout << ans[i];
    }
    cout << ln;
    return 0;
}

// Attack on titan<3

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(nullptr);
    int t = 1e9;
    //cin >> t;
    for(int cases = 0 ; cases < t;cases ++) {
        if(solve())
            break;
        #ifdef ONPC
        cerr << "__________\n";
        #endif
    }
}
// Just Imaginary
#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...