Submission #447686

#TimeUsernameProblemLanguageResultExecution timeMemory
447686Haruto810198Port Facility (JOI17_port_facility)C++17
22 / 100
4591 ms1048580 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define double long double

#define FOR(i,l,r,d) for(int i=(l);i<=(r);i+=(d))
#define szof(x) ((int)(x).size())

#define vi vector<int>
#define pii pair<int,int>

#define F first
#define S second

#define pb push_back
#define eb emplace_back
#define mkp make_pair

const int INF = 2147483647;
const int LNF = INF*INF;
const int MOD = 1000000007;
const int mod = 998244353;
const double eps = 1e-12;

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")

const int MAX = 1000010;

int n;
int in[MAX], out[MAX];
int op[2*MAX];

bool popped[MAX];
vi edge[MAX];

list<int> qu;

int pa[MAX];
int dep[MAX];

int CC;

int findp(int v){
    if(v == pa[v]) return v;
    return (pa[v] = findp(pa[v]));
}

void uni(int u, int v){
    int pu = findp(u);
    int pv = findp(v);
    if(pu == pv) return;

    CC--;
    if(dep[pu] > dep[pv]){
        pa[pv] = pu;
    }
    else if(dep[pu] == dep[pv]){
        pa[pv] = pu;
        dep[pu]++;
    }
    else{
        pa[pu] = pv;
    }
}

int tag[MAX];
int vis[MAX];
int res = 1;

void dfs(int v){
    for(int i : edge[v]){
        if(vis[i] == 0){
            vis[i] = 1;
            tag[i] = 1 - tag[v];
            dfs(i);
        }
        else{
            if(tag[i] + tag[v] != 1){
                res = 0;
            }
        }
    }
}

signed main(){

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n;
    FOR(i, 1, n, 1){
        cin>>in[i]>>out[i];
        op[in[i]] = i;
        op[out[i]] = -i;
    }

    FOR(i, 1, n, 1){
        pa[i] = i;
        dep[i] = 0;
        tag[i] = -1;
        vis[i] = 0;
    }
    CC = n;

    FOR(i, 1, 2*n, 1){

        if(op[i] > 0){
            qu.pb(op[i]);
        }
        else if(op[i] < 0){

            popped[-op[i]] = 1;

            auto it = prev(qu.end());

            for( ; *it!= -op[i]; it = prev(it)){
                if(popped[*it] == 1){
                    qu.erase(it);
                }
                else{
                    edge[-op[i]].pb(*it);
                    edge[*it].pb(-op[i]);
                    uni(-op[i], *it);
                }
            }

            qu.erase(it);

        }

    }

    FOR(i, 1, n, 1){
        /*
        cerr<<"edge["<<i<<"] : ";
        for(int j : edge[i]){
            cerr<<j<<" ";
        }
        cerr<<endl;
        */
    }

    FOR(i, 1, n, 1){
        if(vis[i] == 0){
            tag[i] = 0;
            dfs(i);
        }
    }

    FOR(i, 1, CC, 1){
        res *= 2;
        res %= MOD;
    }

    cout<<res<<'\n';

    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...