Submission #1205806

#TimeUsernameProblemLanguageResultExecution timeMemory
1205806lightonStranded Far From Home (BOI22_island)C++20
0 / 100
292 ms70888 KiB
#include<bits/stdc++.h>
#define pb push_back
#define all(v) v.begin(),v.end()
#define forf(i,s,e) for(int i = s; i<=e; i++)
#define forb(i,s,e) for(int i = s; i>=e; i--)
#define idx(i,v) lower_bound(all(v),i)-v.begin()
#define comp(v) v.erase(unique(all(v)),v.end())
#define sz(v) (int)v.size()
#define fs first
#define se second
#define SP << " " <<
#define LN << "\n"
#define IO cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false);
using namespace std;
typedef long long ll;
ll inf = 1e18;
int N,M;
pair<ll,int> S[1000001];
vector<int> G[1000001];
int num[1000001];
vector<int> ch[1000001];
int in[1000001], out[1000001], ord;
ll sum[1000001];
int ans[1000001];

void dfs(int now){
    sum[now] = S[num[now]].fs;
    in[now] = ++ord;
    for(auto i : ch[now]){
        dfs(i);
        sum[now] += sum[i];
    }
    out[now] = ord;
}

struct Seg{
    ll arr[4000001];
    void update(int now, int s, int e, int f, ll x){
        if(s==e){ arr[now] = x; return; }
        int m = s+e>>1;
        if(f<=m) update(now*2,s,m,f,x);
        else update(now*2+1,m+1,e,f,x);
        arr[now] = min(arr[now*2], arr[now*2+1]);
    }
    ll query(int now, int s, int e, int l, int r){
        if(l>r) return inf;
        if(l<=s && e<=r) return arr[now];
        if(l>e || r<s) return inf;
        int m = s+e>>1;
        return min(query(now*2,s,m,l,r) , query(now*2+1,m+1,e,l,r));
    }
} seg;
struct DSU{
    int grp[1000001];
    void init(int n){forf(i,1,n) grp[i] = i;}
    int fi(int x){
        if(grp[x] == x) return x;
        return grp[x] = fi(grp[x]);
    }
    void un(int x, int y){
        x = fi(x), y = fi(y);
        if(num[x] < num[y]) grp[x] = y;
        else grp[y] = x;
    }
} dsu;

void upd(int u){
    ans[u] = 1;
    for(auto v : G[u]){
        seg.update(1,1,N,v,S[num[u]].fs);
    }
}

int main(){
    cin>>N>>M;
    forf(i,1,N) cin>>S[i].fs, S[i].se = i;
    forf(i,1,M){int u,v; cin>>u>>v; G[u].pb(v), G[v].pb(u);}
    sort(S+1,S+N+1);
    forf(i,1,N) num[S[i].se] = i;

    dsu.init(N);
    forf(i,1,N){
        int u = S[i].se;
        for(auto v : G[u]) if(num[v] < num[u] && dsu.fi(v) != dsu.fi(u)) ch[u].pb(dsu.fi(v)), dsu.un(u,v);
    }

    dfs(S[N].se);
    forf(i,1,N) seg.update(1,1,N,i,inf);
    upd(S[N].se);

    forb(i,N-1,1){
        int u = S[i].se;
        if(sum[u] >= seg.query(1,1,N,in[u], out[u])) upd(u);
    }

    forf(i,1,N) cout<<ans[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...