Submission #637788

#TimeUsernameProblemLanguageResultExecution timeMemory
637788LeonaRagingStranded Far From Home (BOI22_island)C++14
100 / 100
298 ms52172 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define fi first
#define se second
#define ll long long
#define pb push_back
#define db(val) "[" #val " = " << (val) << "] "

const ll mod = 1e9 + 7;
const int maxn = 2e5 + 4;
const int INF = 1e9;

int n, m, a[maxn], vis[maxn];
vector<int> adj[maxn], nodes[maxn], vals, myVec[maxn];

struct DisjointSet {
    vector<int> par, Rank;
    DisjointSet(int n) {
        par.resize(n + 4); Rank.resize(n + 4);
        for (int i = 1; i <= n; i++)
            par[i] = i, Rank[i] = vals[a[i]], myVec[i].pb(i);
    }
    int find(int x) {
        if (x != par[x]) par[x] = find(par[x]);
        return par[x];
    }
    bool join(int u, int v) {
        u = find(u); v = find(v);
        if (u == v) return u;
        if (Rank[u] < Rank[v])
            swap(u, v);
        Rank[u] += Rank[v];
        par[v] = u;
        if (myVec[u].size() < myVec[v].size())
            swap(myVec[u], myVec[v]);
        for (auto it : myVec[v]) {
            vis[it] = 1;
            myVec[u].pb(it);
        }
        myVec[v].clear();
        return 1;
    }
};

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    //freopen(".INP", "r", stdin);
    //freopen(".OUT", "w", stdout);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        vals.pb(a[i]);
    }
    sort(vals.begin(), vals.end());
    vals.erase(unique(vals.begin(), vals.end()), vals.end());
    for (int i = 1; i <= n; i++) {
        a[i] = lower_bound(vals.begin(), vals.end(), a[i]) - vals.begin();
        nodes[a[i]].pb(i);
    }
    for (int i = 1; i <= m; i++) {
        int u, v; cin >> u >> v;
        if (a[u] == a[v]) {
            adj[u].pb(v);
            adj[v].pb(u);
        }
        else {
            if (a[u] < a[v]) swap(u, v);
            adj[u].pb(v);
        }
    }
    bitset<maxn> res;
    res.set();
    DisjointSet Dsu(n);
    for (int i = 0; i < (vals.size()); i++) {
        for (int u : nodes[i]) {
            vis[u] = 1;
            for (int v : adj[u]) {
                if (vis[v]) {
                    v = Dsu.find(v);
                    if (Dsu.Rank[v] < vals[a[u]]) {
                        for (int node : myVec[v]) {
                            res[node] = 0;
                        }
                        myVec[v].clear();
                    }
                }
                Dsu.join(u, v);
            }
        }
    }
    for (int i = 1; i <= n; i++)
        cout << res[i];
}

Compilation message (stderr)

island.cpp: In function 'int main()':
island.cpp:78:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |     for (int i = 0; i < (vals.size()); 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...