제출 #95293

#제출 시각아이디문제언어결과실행 시간메모리
95293dalgerokPort Facility (JOI17_port_facility)C++14
100 / 100
2912 ms131204 KiB
#include<bits/stdc++.h>
using namespace std;



const int N = 2e6 + 5, MOD = 1e9 + 7, INF = 1e9;



int n, cl[N], b[N], pos[N], t1[4 * N], t2[4 * N];
pair < int, int > a[N];


void build(int v, int l, int r){
    if(l == r){
        t1[v] = t2[v] = b[l];
        return;
    }
    int mid = (r + l) >> 1;
    build(v + v, l, mid);
    build(v + v + 1, mid + 1, r);
    t1[v] = max(t1[v + v], t1[v + v + 1]);
    t2[v] = min(t2[v + v], t2[v + v + 1]);
}
void del(int v, int l, int r, int pos){
    if(l == r){
        t1[v] = -INF;
        t2[v] = +INF;
        return;
    }
    int mid = (r + l) >> 1;
    if(pos <= mid){
        del(v + v, l, mid, pos);
    }
    else{
        del(v + v + 1, mid + 1, r, pos);
    }
    t1[v] = max(t1[v + v], t1[v + v + 1]);
    t2[v] = min(t2[v + v], t2[v + v + 1]);
}
int get_min(int v, int l, int r, int tl, int tr){
    if(l > r || l > tr || tl > r){
        return +INF;
    }
    if(tl <= l && r <= tr){
        return t2[v];
    }
    int mid = (r + l) >> 1;
    return min(get_min(v + v, l, mid, tl, tr), get_min(v + v + 1, mid + 1, r, tl, tr));
}
int get_max(int v, int l, int r, int tl, int tr){
    if(l > r || l > tr || tl > r){
        return -INF;
    }
    if(tl <= l && r <= tr){
        return t1[v];
    }
    int mid = (r + l) >> 1;
    return max(get_max(v + v, l, mid, tl, tr), get_max(v + v + 1, mid + 1, r, tl, tr));
}

void dfs(int v, int color = 0){
    cl[v] = color;
    del(1, 1, 2 * n, a[v].first);
    del(1, 1, 2 * n, a[v].second);
    while(true){
        int l = get_min(1, 1, 2 * n, a[v].first, a[v].second);
        if(l >= a[v].first){
            break;
        }
        int to = pos[l];
        if(cl[to] != -1){
            if(cl[to] != cl[v]){
                cout << 0;
                exit(0);
            }
        }
        dfs(to, (color ^ 1));
    }
    while(true){
        int r = get_max(1, 1, 2 * n, a[v].first, a[v].second);
        if(r <= a[v].second){
            break;
        }
        int to = pos[r];
        if(cl[to] != -1){
            if(cl[to] != cl[v]){
                cout << 0;
                exit(0);
            }
        }
        dfs(to, (color ^ 1));
    }
}

void check(){
    vector < int > q[2];
    for(int i = 1; i <= 2 * n; i++){
        int x = pos[i];
        if(i == a[x].first){
            q[cl[x]].push_back(x);
        }
        else{
            if(q[cl[x]].back() != x){
                cout << 0;
                exit(0);
            }
            q[cl[x]].pop_back();
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i].first >> a[i].second;
    }
    sort(a + 1, a + n + 1);
    for(int i = 1; i <= n; i++){
        int x = a[i].first, y = a[i].second;
        b[x] = y;
        b[y] = x;
        pos[x] = pos[y] = i;
    }
    build(1, 1, 2 * n);
    memset(cl, -1, sizeof(cl));
    int ans = 1;
    for(int i = 1; i <= n; i++){
        if(cl[i] == -1){
            dfs(i);
            ans += ans;
            if(ans >= MOD){
                ans -= MOD;
            }
        }
    }
    check();
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...