Submission #646967

#TimeUsernameProblemLanguageResultExecution timeMemory
646967adrilenStranded Far From Home (BOI22_island)C++17
100 / 100
230 ms25912 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
typedef pair<int, int> pii;
constexpr int maxn = 2e5;

int isize[maxn], parent[maxn];
ll cursize[maxn];
bool marked[maxn] = { 0 };

int find(const int &p)
{
    if (p == parent[p]) return p;

    int last = parent[p];
    parent[p] = find(parent[p]);

    if (marked[last]) marked[p] = true;

    return parent[p];
}

void merge(int d, int b)        // a is newly inserted node, b is old
{
    int a;
    a = find(d), b = find(b);

    if (a == b) return ;


    // a will allways take b, but b will not allways take a

    // printf("%d %d %d %d\n", a, b, cursize[b], isize[a]);
    if (cursize[b] >= isize[d])
    {
        // Both will take each other
        cursize[b] += cursize[a];
        parent[a] = b;
    } else {
        cursize[a] += cursize[b];
        parent[b] = a;
        marked[b] = true;
    }

}


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n, m;
    cin >> n >> m;

    for (int i = 0; i < n; i++) parent[i] = i;

    vector <pii> pq(n);
    for (int i = 0; i < n; i++) {
        cin >> isize[i];
        cursize[i] = isize[i];
        pq[i] = pii(isize[i], i);
    }

    sort(pq.begin(), pq.end());

    vector <vector <int>> adj(n);
    int a, b;
    for (int i = 0; i < m; i++)
    {
        cin >> a >> b;
        a--; b--;
        adj[a].emplace_back(b);
        adj[b].emplace_back(a);
    }

    vector <int> created(n);

    auto it = pq.begin();
    int pos;
    while (it != pq.end())
    {
        pos = (*it).second;
        it++;

        created[pos] = true;

        for (int nei : adj[pos])
        {
            if (!created[nei]) continue;

            merge(pos, nei);
        }
    }


    for (int i = 0; i < n; i++) find(i);

    for (int i = 0; i < n; i++) cout << !marked[i];
    cout << "\n";
}
#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...