제출 #1323103

#제출 시각아이디문제언어결과실행 시간메모리
1323103NValchanovStranded Far From Home (BOI22_island)C++20
100 / 100
280 ms38876 KiB
#include <iostream>
#include <vector>
#include <cassert>
#include <algorithm>

using namespace std;

typedef long long llong;

const int MAXN = 2e5 + 10;


int n, m;
pair < int, int > ord[MAXN];
int c[MAXN];
vector < int > adj[MAXN];

int leader[MAXN];
int sz[MAXN];
llong sum[MAXN];
vector < int > nodes[MAXN];

bool ans[MAXN];

int findLeader(int u)
{
    return leader[u] == u ? u : leader[u] = findLeader(leader[u]);
}

bool connected(int u, int v)
{
    return findLeader(u) == findLeader(v);
}

void unite(int u, int v)
{
    if(connected(u, v))
        return;

    u = findLeader(u);
    v = findLeader(v);

    if(sz[u] < sz[v])
        swap(u, v);
    
    sz[u] += sz[v];
    leader[v] = u;
    sum[u] += sum[v];

    for(int &node : nodes[v])
    {
        nodes[u].push_back(node);
    }

    nodes[v].clear();
}

void read()
{
    cin >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        cin >> c[i];
    }

    for(int i = 1; i <= m; i++)
    {
        int u, v;
        cin >> u >> v;

        adj[u].push_back(v);
        adj[v].push_back(u);
    }
}

void solve()
{
    for(int i = 1; i <= n; i++)
    {
        ord[i] = {c[i], i};
    }

    for(int i = 1; i <= n; i++)
    {
        ans[i] = true;
    }

    for(int i = 1; i <= n; i++)
    {
        leader[i] = i;
        sz[i] = 1;
        sum[i] = c[i];
        nodes[i].push_back(i);
    }

    sort(ord + 1, ord + n + 1);

    for(int i = 1; i <= n; i++)
    {
        int u = ord[i].second;

        for(int v : adj[u])
        {
            if(connected(u, v) || sum[findLeader(u)] < c[v])
                continue;

            if(sum[findLeader(v)] < c[u])
            {
                for(int &node : nodes[findLeader(v)])
                {
                    ans[node] = false;
                }
            }

            unite(u, v);
        }
    }

    for(int i = 1; i <= n; i++)
    {
        cout << ans[i];
    }

    cout << endl;
}

int main()
{
    read();
    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...