제출 #1105004

#제출 시각아이디문제언어결과실행 시간메모리
1105004MateiKing80Stranded Far From Home (BOI22_island)C++14
100 / 100
243 ms44184 KiB
#include <bits/stdc++.h>

using namespace std;

int papa(int u, vector<int> &p)
{
    if(p[u] < 0)
        return u;
    return p[u] = papa(p[u], p);
}

void unite(int u, int v, vector<int> &p, vector<long long> &put)
{
    u = papa(u,p), v = papa(v,p);
    if(u == v)
        return;
    if(p[u] > p[v])
        swap(u,v);
    p[u] += p[v];
    p[v] = u;
    put[u] += put[v];
}

void dfs(int u, int sus, vector<int> &castig, vector<vector<int>> &ok)
{
    castig[u] &= sus;
    for(int v : ok[u])
        dfs(v, castig[u], castig, ok);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin >> n >> m;
    vector<int> s(n);
    for(int &x : s)
        cin >> x;
    vector<vector<int>> g(n);
    for(int i = 0, u, v; i < m; i ++)
    {
        cin >> u >> v;
        u--, v--;
        g[u].push_back(v), g[v].push_back(u);
    }
    vector<int> castig(n, 1), p(n, -1), viz(n), ins(n), rep(n);
    vector<long long> put(n);
    vector<vector<int>> ok(n);
    vector<pair<int,int>> order(n);
    for(int i = 0; i < n; i ++)
    {
        put[i] = s[i];
        order[i] = {s[i], i};
    }
    sort(order.begin(), order.end());
    for(auto t : order)
    {
        int u = t.second;
        for(int v : g[u])
            if(ins[v])
            {
                int w = rep[papa(v,p)];
                if(put[papa(v,p)] < s[u])
                    castig[w] = 0;
                if(!viz[w])
                {
                    ok[u].push_back(w);
                    viz[w] = 1;
                }
            }
        for(int v : g[u])
            if(ins[v])
                viz[rep[papa(v,p)]] = 0;
        for(int v : g[u])
            if(ins[v])
                unite(u, v, p, put);
        rep[papa(u,p)] = u;
        ins[u] = 1;
    }
    dfs(order[n - 1].second, 1, castig, ok);
    for(int i = 0; i < n; i ++)
        cout << castig[i];
}
#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...