제출 #1320327

#제출 시각아이디문제언어결과실행 시간메모리
1320327888313666Stranded Far From Home (BOI22_island)C++20
0 / 100
94 ms18544 KiB
#include <bits/stdc++.h>  
using namespace std;
typedef long long ll;
#define _ <<' '<<
#define print(x) cout<<#x<<": "<<(x)<<'\n'

int n,m;
vector<vector<int>> adj;
vector<ll> s;
vector<int> res;
vector<array<ll, 2>> srt;

struct dsu{
    int n;
    vector<int> par;
    vector<ll> sz;

    dsu(const int n) {
        this->n=n;
        par.resize(n);
        sz=s;
        iota(par.begin(), par.end(), 0);
    }

    int find(const int i) {
        if (par[i]==i) return i;
        const auto p=par[i];
        const auto d=find(par[i]);
        if (!res[p]) res[i]=0;
        return par[i]=d;
    }

    ll size(const int i) {
        return sz[find(i)];
    }

    bool unite(int i, int j) {
        i=find(i), j=find(j);
        if (i==j) return false;
        par[j]=i;
        sz[i]+=sz[j];
        return true;
    }
};

bool bfs(const int st) {
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> q;
    vector<int> vis(n, 0);
    ll cur=s[st];
    for (const auto v:adj[st]) q.push({s[v], v});
    vis[st]=1;
    while (!q.empty()) {
        const auto [d, u]=q.top();
        q.pop();
        if (vis[u]) continue;
        vis[u]=1;
        if (d>cur) return false;
        cur+=d;
        for (const auto v:adj[u]) if (!vis[v]) q.push({s[v], v});
    }
    return true;
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    cout.tie(0);
    cin>>n>>m;
    adj.resize(n);
    s.resize(n);
    res.assign(n, 1);
    srt.resize(n);
    for (auto &e:s) cin>>e;
    for (int i=0; i<m; i++) {
        int a,b;
        cin>>a>>b;
        if (s[--a]>s[--b]) adj[a].push_back(b);
        else adj[b].push_back(a);
    }
    for (int i=0; i<n; i++) {
        srt[i][0]=s[i];
        srt[i][1]=i;
    }
    sort(srt.begin(), srt.end());
    int l=0, r=0, w=0;
    dsu f(n);
    while (l!=n) {
        w=srt[l][0];
        while (r<n-1 && srt[r+1][0]==w) ++r;
        ++r;
        //cout<<l _ r<<'\n';
        for (int i=l; i<r; ++i) {
            for (const auto v:adj[srt[i][1]]) f.unite(srt[i][1], v);
        }
        if (r==n) break;
        for (int i=l; i<r; i++) {
            //cout<<i _ r _ f.size(srt[i][1]) _ srt[r][0]<<'\n';
            if (f.size(srt[i][1])<srt[r][0]) res[srt[i][1]]=0;
        }
        l=r;
    }
    for (int i=0; i<n; i++) f.find(i);
    for (const auto e:res) cout<<e;
    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...