Submission #531780

#TimeUsernameProblemLanguageResultExecution timeMemory
531780K4YANPort Facility (JOI17_port_facility)C++17
10 / 100
5 ms620 KiB
//Be Name Khoda

#include<bits/stdc++.h>
#pragma GCC optmize("Ofast,unroll-loops")
#pragma GCC target ("avx2,tune=native")

using namespace std;

#define ll long long
#define ld long double
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
#define pll pair<ll, ll>
#define plll pair<pll, ll>

const ll mxn = 2e6 + 16, md = 1e9 + 7;
ll n, m, q, w;
vector<ll> A, B;
bitset<mxn> mark;

void input() {

    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> q; q--;
        A.push_back(q);
        cin >> q; q--;
        B.push_back(q);
    }

}

struct item {
    ll mn, mx, type;
};

struct segtree {

    ll sz = 1;
    item NE = {mxn, -1, -1};
    vector<item> v;


    void init(int n) {
        while(sz < n) sz <<= 1;
        v.assign(2 * sz, NE);
    }
    void update(int x) {
        v[x].mn = min(v[2 * x + 1].mn, v[2 * x + 2].mn);
        v[x].mx = max(v[2 * x + 1].mx, v[2 * x + 2].mx);
        return;
    }
    void add_to_mn(int i, pll p, int x, int lx, int rx) {
        if(rx - lx == 1) {
            v[x].mn = p.first, v[x].type = p.second;
            return;
        }
        int m = (lx + rx) >> 1;
        if(i < m) add_to_mn(i, p, 2 * x + 1, lx, m);
        else add_to_mn(i, p, 2 * x + 2, m, rx);
        v[x].mn = min(v[2 * x + 1].mn, v[2 * x + 2].mn);
        return;
    }
    void add_to_mn(int i, pll p) {
        add_to_mn(i, p, 0, 0, sz);
        return;
    }
    void add_to_mx(int i, pll p, int x, int lx, int rx) {
        if(rx - lx == 1) {
            v[x].mx = p.first, v[x].type = p.second;
            return;
        }
        int m = (lx + rx) >> 1;
        if(i < m) add_to_mx(i, p, 2 * x + 1, lx, m);
        else add_to_mx(i, p, 2 * x + 2, m, rx);
        v[x].mx = max(v[2 * x + 1].mx, v[2 * x + 2].mx);
        return;
    }
    void add_to_mx(int i, pll p) {
        add_to_mx(i, p, 0, 0, sz);
        return;
    }
    pll find_mn(int l, int r, int x, int lx, int rx) {
        if(rx <= l || r <= lx) return {mxn, -1};
        if(rx - lx == 1) {
            if(v[x].mn < l - 1) {
                return {v[x].mn, v[x].type};
            } return {mxn, -1};
        }
        int m = (lx + rx) >> 1;
        if(l <= lx && rx <= r) {
            if(v[2 * x + 2].mn < l - 1) {
                return find_mn(l, r, 2 * x + 2, m, rx);
            } if(v[2 * x + 1].mn < l - 1) {
                return find_mn(l, r, 2 * x + 1, lx, m);
            } return {mxn, -1};
        }
        pll p = find_mn(l, r, 2 * x + 2, m, rx);
        if(p.first < mxn) return p;
        p = find_mn(l, r, 2 * x + 1, lx, m);
        return p;
    }
    pll find_mn(int l, int r) {
        return find_mn(l, r, 0, 0, sz);
    }
    pll find_mx(int l, int r, int x, int lx, int rx) {
        if(rx <= l || r <= lx) return {-1, -1};
        if(rx - lx == 1) {
            if(v[x].mx > r) {
                return {v[x].mx, v[x].type};
            } return {-1, -1};
        }
        int m = (lx + rx) >> 1;
        if(l <= lx && rx <= r) {
            if(v[2 * x + 1].mx > r) {
                return find_mx(l, r, 2 * x + 1, lx, m);
            } if(v[2 * x + 2].mx > r) {
                return find_mx(l, r, 2 * x + 2, m, rx);
            } return {-1, -1};
        }
        pll p = find_mx(l, r, 2 * x + 1, lx, m);
        if(p.first > -1) return p;
        p = find_mx(l, r, 2 * x + 2, m, rx);
        return p;
    }
    pll find_mx(int l, int r) {
        return find_mx(l, r, 0, 0, sz);
    }
    void set(int i, int x, int lx, int rx) {
        if(rx - lx == 1) {
            v[x] = NE;
            return;
        }
        int m = (lx + rx) >> 1;
        if(i < m) set(i, 2 * x + 1, lx, m);
        else set(i, 2 * x + 2, m, rx);
        update(x); return;
    }
    void set(int i) {
        set(i, 0, 0, sz);
        return;
    }

}; segtree st;

inline void BFS(int i) {
    vector<ll> bfs; bfs.push_back(i);
    ll ptr = 0, x; pll p;
    st.set(A[i]), st.set(B[i]);

    while(ptr < int(bfs.size())) {
        x = bfs[ptr++];
        mark.set(x);
        p = {0, 0};
        while(p.second > -1) {
            p = st.find_mx(A[x] + 1, B[x]);
            if(p.second == -1 || p.first == -1) break;
            bfs.push_back(p.second);
            st.set(A[p.second]), st.set(B[p.second]);
        } p = {0, 0};
        while(p.second > -1) {
            p = st.find_mn(A[x] + 1, B[x]);
            if(p.second == -1 || p.first == mxn) break;
            bfs.push_back(p.second);
            st.set(A[p.second]), st.set(B[p.second]);
        }
    }
    return;
}

void solve() {

    st.init(2 * n);
    for(int i = 0; i < n; i++) {
        st.add_to_mn(B[i], {A[i], i});
        st.add_to_mx(A[i], {B[i], i});
    }
    for(int i = 0; i < n; i++) {
        pll p, b;
        p = st.find_mn(A[i] + 1, B[i]);
        b = st.find_mx(A[i] + 1, B[i]);
        if(p.first == mxn || b.first == -1) continue;
        if(p.second == -1 || b.second == -1) continue;
        if(B[p.second] > A[b.second]) {
            cout << "0\n";
            return;
        }
    }
    ll cnt = 0, ans = 1;
    for(int i = 0; i < n; i++) {
        if(!mark[i]) {
            BFS(i); cnt++;
        }
    }
    for(int i = 0; i < cnt; i++) {
        ans <<= 1; ans %= md;
    } cout << ans << endl;

}

int main() {

    ios::sync_with_stdio(false); cin.tie(NULL);

    input(), solve();  

    return 0;

}

Compilation message (stderr)

port_facility.cpp:4: warning: ignoring '#pragma GCC optmize' [-Wunknown-pragmas]
    4 | #pragma GCC optmize("Ofast,unroll-loops")
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...