Submission #1336361

#TimeUsernameProblemLanguageResultExecution timeMemory
1336361AndreyPort Facility (JOI17_port_facility)C++20
0 / 100
35 ms8260 KiB
#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1000001;

vector<pair<int,int>> seg[8*MAXN];
vector<pair<int,int>> dsu(MAXN);

pair<int,int> dsucalc(int a) {
    int c = a,sb = 0;
    while(dsu[c].first != c) {
        sb+=dsu[c].second;
        c = dsu[c].first;
    }
    int x = sb,e = a;
    while(e != dsu[e].first) {
        pair<int,int> d = dsu[e];
        dsu[e] = {c,abs(x)%2};
        x-=d.second;
        e = d.first;
    }
    sb%=2;
    return {c,sb};
}

void upd(int l, int r, int x, int ql, int qr, int c) {
    if(ql > r || qr < l) {
        return;
    }
    if(l >= ql && r <= qr) {
        seg[x].push_back({c,0});
        return;
    }
    int mid = (l+r)/2;
    upd(l,mid,x*2,ql,qr,c);
    upd(mid+1,r,x*2+1,ql,qr,c);
}

void calc(int l, int r, int x, int p, int c) {
    bool yeah0 = false,yeah1 = false;
    for(pair<int,int> v: seg[x]) {
        pair<int,int> x = dsucalc(v.first);
        x = {x.first,x.second+v.second};
        if(x.first != c) {
            if(x.second%2) {
                yeah1 = true;
            }
            else {
                yeah0 = true;
            }
            dsu[x.first] = {c,(x.second+1)%2};
        }
        else {
            if(x.second%2) {
                yeah0 = true;
            }
            else {
                yeah1 = true;
            }
        }
    }
    seg[x].clear();
    if(yeah0) {
        seg[x].push_back({c,1});
    }
    if(yeah1) {
        seg[x].push_back({c,0});
    }
    if(l == r) {
        return;
    }
    int mid = (l+r)/2;
    if(p <= mid) {
        calc(l,mid,x*2,p,c);
    }
    else {
        calc(mid+1,r,x*2+1,p,c);
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        dsu[i] = {i,0};
    }
    vector<int> pos(n+1);
    vector<int> r(2*n+1);
    for(int i = 1; i <= n; i++) {
        int a,b;
        cin >> a >> b;
        pos[i] = a;
        r[b] = i;
    }
    for(int i = 1; i <= 2*n; i++) {
        if(r[i] != 0) {
            int v = r[i];
            calc(1,2*n,1,pos[v],v);
            upd(1,2*n,1,pos[v],i,v);
        }
    }
    int br = 0;
    for(int i = 1; i <= n; i++) {
        if(dsu[i].first == i) {
            br++;
        }
    }
    vector<int> col(n+1);
    stack<int> idk1;
    stack<int> idk2;
    for(int i = 1; i <= n; i++) {
        col[i] = dsucalc(i).second%2;
    }
    for(int i = 1; i <= n; i++) {
        r[pos[i]] = -i;
    }
    for(int i = 1; i <= 2*n; i++) {
        int v = abs(r[i]);
        if(r[i] < 0) {
            if(col[v]) {
                idk1.push(v);
            }
            else {
                idk2.push(v);
            }
        }
        else {
            if(col[v]) {
                if(idk1.top() != v) {
                    cout << 0;
                    return 0;
                }
                idk1.pop();
            }
            else {
                if(idk2.top() != v) {
                    cout << 0;
                    return 0;
                }
                idk2.pop();
            }
        }
    }
    int ans = 1;
    for(int i = 0; i < br; i++) {
        ans+=ans;
        ans%=1000000007;
    }
    cout << ans;
    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...