Submission #749277

#TimeUsernameProblemLanguageResultExecution timeMemory
749277GrindMachineStranded Far From Home (BOI22_island)C++17
100 / 100
628 ms77540 KiB
// Om Namah Shivaya

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long int ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define pb push_back
#define endl '\n'
#define sz(a) a.size()
#define setbits(x) __builtin_popcountll(x)
#define ff first
#define ss second
#define conts continue
#define ceil2(x, y) ((x + y - 1) / (y))
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "Yes" << endl
#define no cout << "No" << endl

#define rep(i, n) for(int i = 0; i < n; ++i)
#define rep1(i, n) for(int i = 1; i <= n; ++i)
#define rev(i, s, e) for(int i = s; i >= e; --i)
#define trav(i, a) for(auto &i : a)

template<typename T>
void amin(T &a, T b) {
    a = min(a, b);
}

template<typename T>
void amax(T &a, T b) {
    a = max(a, b);
}

#ifdef LOCAL
#include "debug.h"
#else
#define debug(x) 42
#endif

/*

refs:
edi
https://github.com/koosaga/olympiad/blob/master/Baltic/baltic22_island.cpp

*/

const int MOD = 1e9 + 7;
const int N = 2e5 + 5;
const int inf1 = int(1e9) + 5;
const ll inf2 = ll(1e18) + 5;

set<pll> st;

struct DSU {
    vector<int> par, rankk, siz;
    vector<ll> val;
    vector<vector<int>> here;

    DSU() {

    }

    DSU(int n) {
        init(n);
    }

    void init(int n) {
        par = vector<int>(n + 1);
        rankk = vector<int>(n + 1);
        siz = vector<int>(n + 1);
        val = vector<ll>(n + 1);
        here = vector<vector<int>>(n+1);
        rep(i, n + 1) create(i);
    }

    void create(int u) {
        par[u] = u;
        rankk[u] = 0;
        siz[u] = 1;
        val[u] = 0;
        here[u].pb(u);
    }

    int find(int u) {
        if (u == par[u]) return u;
        else return par[u] = find(par[u]);
    }

    bool same(int u, int v) {
        return find(u) == find(v);
    }

    void merge(int u, int v) {
        u = find(u), v = find(v);
        if (u == v) return;

        if (rankk[u] == rankk[v]) rankk[u]++;
        if (rankk[u] < rankk[v]) swap(u, v);

        if(st.count({val[u], u})){
            st.erase({val[u], u});
        }

        if(st.count({val[v], v})){
            st.erase({val[v], v});
        }

        par[v] = u;
        siz[u] += siz[v];
        val[u] += val[v];

        st.insert({val[u], u});

        if(sz(here[u]) < sz(here[v])){
            swap(here[u], here[v]);
        }

        trav(x,here[v]){
            here[u].pb(x);
        }

        here[v].clear();
    }
};

vector<ll> adj[N];

void solve(int test_case)
{
    ll n,m; cin >> n >> m;
    vector<ll> a(n+5);
    rep1(i,n) cin >> a[i];
    rep1(i,m){
        ll u,v; cin >> u >> v;
        adj[u].pb(v), adj[v].pb(u);
    }

    map<ll,vector<ll>> mp;
    rep1(i,n) mp[a[i]].pb(i);

    vector<pair<ll,vector<ll>>> b;
    trav(p,mp) b.pb(p);

    DSU dsu(n+5);
    vector<ll> ans(n+5,1);

    rep(i,sz(b)-1){
        trav(u,b[i].ss){
            dsu.val[u] = a[u];
            st.insert({a[u], u});
        }

        trav(u,b[i].ss){
            trav(v,adj[u]){
                if(a[v] <= a[u]){
                    dsu.merge(u,v);
                }
            }
        }

        ll nxt = b[i+1].ff;

        while(!st.empty()){
            auto [mn, root] = *st.begin();
            if(mn < nxt){
                st.erase(st.begin());
                trav(u,dsu.here[root]){
                    ans[u] = 0;
                }
            }
            else{
                break;
            }
        }
    }

    rep1(i,n) cout << ans[i];
    cout << endl;
}

int main()
{
    fastio;

    int t = 1;
    // cin >> t;

    rep1(i, t) {
        solve(i);
    }

    return 0;
}

Compilation message (stderr)

island.cpp: In function 'void solve(int)':
island.cpp:30:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, std::vector<long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 | #define rep(i, n) for(int i = 0; i < n; ++i)
......
  159 |     rep(i,sz(b)-1){
      |         ~~~~~~~~~                   
island.cpp:159:5: note: in expansion of macro 'rep'
  159 |     rep(i,sz(b)-1){
      |     ^~~
#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...