제출 #1337792

#제출 시각아이디문제언어결과실행 시간메모리
1337792DangKhoizzzzStranded Far From Home (BOI22_island)C++20
0 / 100
304 ms148420 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];
set <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);
    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].insert({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;
            //cout << u << ':';
            auto it = adj[find_set(u)].upper_bound({sum[find_set(u)] , INF});
            if(it == adj[find_set(u)].begin()) continue;
            it--;
            if((*it).fi > s[u])
            {
                check[(*it).se].push_back(u);
                check[u].push_back((*it).se);
            }
            //cout << (*it).se << ' ';
        }
        
        //cout << '\n';
        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...