Submission #624116

#TimeUsernameProblemLanguageResultExecution timeMemory
624116Andyvanh1Stranded Far From Home (BOI22_island)C++14
100 / 100
311 ms58036 KiB
#include <bits/stdc++.h>

using namespace std;

#define vt vector
#define pb push_back
#define all(x) x.begin(),x.end()
#define FORR1(x) for(int i = 0; i < (x); i++)
#define FORR2(j,x) for(int (j) = 0; (j) < (x); (j)++)
#define f first
#define s second
#define MOD 998244353
#define INF INT_MAX

typedef vt<int> vi;
typedef vt<long long> vl;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ll,int> pli;

struct Segtree{
    vl arr;
    vl lz1;
    vl lz2;
    int sz = 1;


    void init(int n, vl cop) {
        while(sz<n)sz*=2;
        arr.resize(2*sz);
        lz1.resize(2*sz);
        lz2.resize(2*sz);
        FORR1(n){
            arr[sz+i] = cop[i];
        }
        FORR1(sz-n){
            arr[sz+i+n] = 0;
        }
        for(int i = sz-1; i>0; i--){
            arr[i] = arr[2*i]+arr[2*i+1];
        }
        FORR1(2*sz){
            lz1[i] = lz2[i] = 0;
        }
    }

    void pushlazy(int x, int lth){
        if(lth==1){
            arr[x] += lz1[x];
            lz1[x] = 0;
            lz2[x] = 0;
            return;
        }
        arr[x] += lz1[x]*lth + (((ll)lth*(lth-1))>>1)*lz2[x];
        lz1[2*x] +=lz1[x];
        lz2[2*x] += lz2[x];
        lz1[2*x+1] += lz1[x]+(lth>>1)*lz2[x];
        lz2[2*x+1] += lz2[x];
        lz1[x] = lz2[x] = 0;
    }


    void add(int index, int val){
        int cur = index+sz;
        while(cur!=0){
            arr[cur]+=val;
            cur>>=1;
        }
    }

    ll get(int l, int r, int x, int lx, int rx){
        if(lx>r||l>rx){
            return 0;
        }else if(l<=lx && r>=rx){

            pushlazy(x,rx-lx+1);
            return arr[x];
        }else{
            pushlazy(x,rx-lx+1);
            int mid = (lx+rx)>>1;
            return get(l,r,2*x,lx,mid)+get(l,r,2*x+1,mid+1,rx);
        }
    }

    ll get(int l, int r){
        return get(l,r,1,0,sz-1);
    }

    void set1(int l, int r, int x, int lx, int rx){
        pushlazy(x,rx-lx+1);
        if(l>rx||r<lx){
            return;
        }else if(l<=lx&&r>=rx){
            lz1[x] = 1+lx-l;
            lz2[x] = 1;
            pushlazy(x,rx-lx+1);
        }else{
            int mid = (lx+rx)>>1;
            set1(l,r,2*x,lx,mid);
            set1(l,r,2*x+1,mid+1,rx);
            arr[x] = arr[2*x]+arr[2*x+1];
        }
    }

    void set1(int l, int r){
        set1(l,r,1,0,sz-1);
    }




};

int pp[200005];
ll sums[200005];
int vals[200005];
vi up[200005];
vi dn[200005];
bool ans[200005];
set<pli> st[200005];

int find(int x){
    return (x==pp[x] ? x : pp[x] = find(pp[x]));
}

void join(int a, int b){
    int u = find(a), v = find(b);
    if(u==v)return;
    if(st[u].size()<st[v].size())swap(u,v);
    for(auto& e: st[v])st[u].insert(e);
    sums[u]+=sums[v];
    pp[v] = u;
}

int go[200005];



void solve() {
    int n, m;
    cin>>n>>m;
    FORR1(n)cin>>vals[i];
    FORR1(m){
        int u, v;
        cin>>u>>v;u--;v--;
        if(make_pair(vals[u],u)>make_pair(vals[v],v)){
            up[v].pb(u);
            dn[u].pb(v);
        }else{
            up[u].pb(v);
            dn[v].pb(u);
        }
    }
    vt<pli> arr(n);
    FORR1(n)arr[i] = {vals[i],i};
    sort(all(arr));
    FORR1(n){
        pp[i] = i;
        sums[i] = vals[i];
        go[i] = -1;
    }
    FORR1(n){
        for(auto& e: up[i]){
            st[i].insert({vals[e],e});
        }
    }

    FORR1(n){
        int x = arr[i].s;
        for(auto& e: dn[x]){
            join(x,e);
        }
        int u = find(x);
        if(dn[x].size()!=0)st[u].erase(st[u].find(arr[i]));
        if(!st[u].empty()){
            auto it = *st[u].begin();
            if(sums[u]>=it.f){
                go[x] = it.s;
            }
        }
    }
    ans[arr[n-1].s] = 1;
    for(int i = n-2; i>=0; i--){
        int x = arr[i].s;
        if(go[x]!=-1&&ans[go[x]]){
            ans[x] = 1;
        }else{
            ans[x] = 0;
        }
    }
    FORR1(n)cout<<ans[i];
    cout<<'\n';









}

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