제출 #673658

#제출 시각아이디문제언어결과실행 시간메모리
673658KahouPort Facility (JOI17_port_facility)C++14
100 / 100
2209 ms109752 KiB
/* In the name of God, aka Allah */
// let this be mytemp.cpp
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define endl '\n'
#define mk make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int mod = 1e9 + 7;
int add(int a, int b) {
        a += b;
        if (a >= mod) a -= mod;
        if (a < 0) a += mod;
        return a;
}
int mul(int a, int b) {
        return 1ll*a*b%mod;
}
int pw(int a, int b) {
        int out = 1;
        while (b) {
                if (b&1) out = mul(out, a);
                a = mul(a,a);
                b>>=1;
        }
        return out;
}
const int inf = 1e9 + 50;
const int N = 2e6 + 50;
int n, id[N], c[N];
pii P[N];
pii seg[N<<2][2];
vector<int> A[2];

void build(int u=1, int tl=1, int tr=2*n) {
        if (tl == tr) {
                seg[u][0] = {P[id[tl]].F, id[tl]}, seg[u][1] = {P[id[tl]].S, id[tl]};
                return;
        }
        int md = (tl+tr)/2;
        int lc = u<<1;
        int rc = u<<1|1;
        build(lc, tl, md), build(rc, md+1, tr);
        seg[u][0] = min(seg[lc][0], seg[rc][0]);
        seg[u][1] = max(seg[lc][1], seg[rc][1]);
}
pii get(int c, int l, int r, int u=1, int tl=1, int tr=2*n) {
        if (r < tl || tr < l) return {(c? -inf:inf), 0};
        if (l <= tl && tr <= r) return seg[u][c];
        int md = (tl+tr)/2;
        int lc = u<<1;
        int rc = u<<1|1;
        pii A = get(c, l, r, lc, tl, md), B = get(c, l, r, rc, md+1, tr);
        return (c? max(A,B) : min(A,B));
}
void upd(int id, int u=1, int tl=1, int tr=2*n) {
        if (id < tl || tr < id) return;
        if (tl == tr) {
                seg[u][0] = {inf, 0};
                seg[u][1] = {-inf, 0};
                return;
        }
        int md = (tl+tr)/2;
        int lc = u<<1;
        int rc = u<<1|1;
        upd(id, lc, tl, md), upd(id, rc, md+1, tr);
        seg[u][0] = min(seg[lc][0], seg[rc][0]);
        seg[u][1] = max(seg[lc][1], seg[rc][1]);
}
void pop(int u) {
        upd(P[u].F), upd(P[u].S);
}

void solve() {
        cin >> n;
        for (int i = 1; i <= n; i++) {
                int l, r;
                cin >> l >> r;
                id[l] = id[r] = i;
                P[i] = {l, r};
        }
        for (int u = 1; u <= n; u++) c[u] = -1;
        build();
        queue<int> q;
        int t = 0;
        for (int i = 1; i <= 2*n; i++) {
                if (c[id[i]] >= 0) continue;
                t++;
                c[id[i]] = 0;
                q.push(id[i]);
                pop(id[i]);
                while(q.size()) {
                        int u = q.front();
                        q.pop();
                        pii x = get(0, P[u].S, 2*n);
                        while (x.F < P[u].S) {
                                int v = x.S;
                                c[v] = 1-c[u];
                                q.push(v);
                                pop(v);
                                x = get(0, P[u].S, 2*n);
                        }
                        x = get(1, 1, P[u].F);
                        while (x.F > P[u].F) {
                                int v = x.S;
                                c[v] = 1-c[u];
                                q.push(v);
                                pop(v);
                                x = get(1, 1, P[u].F);
                        }
                }
        }

        bool flg = 1;
        for (int i = 1; i <= 2*n; i++) {
                int u = id[i];
                if (P[u].F == i) A[c[u]].push_back(u);
                else {
                        if (A[c[u]].back() != u) flg = 0;
                        A[c[u]].pop_back();
                }
        }
        cout << (flg? pw(2, t) : 0) << endl;
}
int main() {
        ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
        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...