제출 #1337845

#제출 시각아이디문제언어결과실행 시간메모리
1337845DangKhoizzzzStranded Far From Home (BOI22_island)C++20
100 / 100
490 ms134220 KiB
#include <bits/stdc++.h>
#define int long long
#define arr3 array <int , 3>
#define pii pair <int , int>
#define fi first
#define se second
#define BIT(x , k) ((x >> k)&1)
#define MASK(x) (1 << x)

using namespace std;

const int maxn = 2e6 + 7;
const int INF = 1e18;

int parent[maxn] , sum[maxn];
priority_queue <pii , vector <pii> , greater <pii>> adj[maxn];

int find_set(int u)
{
    if(parent[u] == u) return u;
    return find_set(parent[u]);
}
void join(int u , int v)
{
    u = find_set(u);
    v = find_set(v);
    if(u == v) return;
    if(adj[u].size() < adj[v].size()) swap(u , v);
    while(!adj[v].empty()) 
    {
        adj[u].push(adj[v].top());
        adj[v].pop();
    }
    parent[v] = u;
    sum[u] += sum[v];
}


vector <int> check[maxn];
int n , m , s[maxn] , ans[maxn];
vector <pii> ord;
vector <int> g[maxn];

void dfs(int u)
{
    ans[u] = 1;
    for(int v: check[u])
    {
        if(ans[v] == 0) 
        {
            dfs(v);
        }
    }
}

void solve()
{
    cin >> n >> m;
    int max_s = 0;
    for(int i = 1; i <= n; i++) 
    {
        cin >> s[i];
        max_s = max(max_s , s[i]);
        ord.push_back({s[i] , i});
    }
    for(int i = 1; i <= m; i++)
    {
        int u , v; cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    sort(ord.begin() , ord.end());
    for(int i = 1; i <= n; i++)
    {
        parent[i] = i;
        sum[i] = s[i];
        for(int v: g[i]) adj[i].push({s[v] , v});
    }
    for(int i = 0; i < n;)
    {
        int j = i;
        while(j < n && ord[j].fi == ord[i].fi) 
        {
            int u = ord[j].se;
            for(int v: g[u])
            {
                if(s[v] <= s[u]) join(v , u);
            }
            j++;
        }
        for(int k = i; k < j; k++)
        {
            int u = ord[k].se;
            int root = find_set(u);
            while(!adj[root].empty() && adj[root].top().fi <= s[u]) adj[root].pop();
            if(!adj[root].empty() && sum[root] >= adj[root].top().fi)
            {
                int v = adj[root].top().se;
                check[v].push_back(u);
                check[u].push_back(v);
            }
        }
        i = j;
    }
    for(int i = 1; i <= n; i++)
    {
        if(s[i] == max_s) dfs(i);
    }
    for(int i = 1; i <= n; i++) cout << ans[i];
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr); 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...