Submission #1312266

#TimeUsernameProblemLanguageResultExecution timeMemory
1312266VMaksimoski008Port Facility (JOI17_port_facility)C++20
100 / 100
1777 ms231324 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;

constexpr int mod = 1e9 + 7;
const int N = 1e6 + 5;

struct segment_tree {
    int n;
    vector<pii> tree;

    segment_tree(int _n) : n(_n), tree(3*n, { 1e9, 0 }) {}

    void update(int p, pii v) {
        for(tree[p+=n]=v; p>1; p>>=1)
            tree[p>>1] = min(tree[p], tree[p^1]);
    }

    pii query(int l, int r) {
        pii ans = { 1e9, 0 };
        for(l+=n,r+=n+1; l<r; l>>=1, r>>=1) {
            if(l&1) ans = min(ans, tree[l++]);
            if(r&1) ans = min(ans, tree[--r]);
        }
        return ans;
    }
};

ll ans = 1;
int col[N];
vector<int> g[N];

void dfs(int u, int c) {
    col[u] = c;

    for(int v : g[u]) {
        if(!col[v]) dfs(v, 3 - c);
        else if(col[v] == col[u]) ans = 0;
    }
}

signed main() {
    int n; cin >> n;
    segment_tree sgtL(2*n), sgtR(2*n);
    vector<int> l(n+1), r(n+1), a(2*n+1);
    for(int i=1; i<=n; i++) {
        cin >> l[i] >> r[i];
        a[l[i]] = a[r[i]] = i;
        sgtL.update(r[i], { l[i], i });
        sgtR.update(l[i], { -r[i], i });
    }

    for(int i=1; i<=n; i++) {
        int pl = sgtL.query(l[i], r[i]).second;
        int pr = sgtR.query(l[i], r[i]).second;

        if(pl && l[pl] < l[i]) {
            g[pl].push_back(i);
            g[i].push_back(pl);
        }

        if(pr && r[pr] > r[i]) {
            g[pr].push_back(i);
            g[i].push_back(pr);
        }
    }

    for(int i=1; i<=n; i++) {
        if(col[i]) continue;
        ans = (ans * 2) % mod;
        dfs(i, 1);
    }
    cout << ans << '\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...