Submission #1237634

#TimeUsernameProblemLanguageResultExecution timeMemory
1237634lambd47Port Facility (JOI17_port_facility)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)


std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

const int MOD=1e9+7;

void solve() {
    int n;cin>>n;
    vector<vector<int>> adj(n);
    vector<int> evs(2*n);
    vector<pair<int,int>> vec(n);
    L(i,0,n-1){
        cin>>vec[i].first>>vec[i].second;
        vec[i].first--;vec[i].second--;
        evs[vec[i].first]=evs[vec[i].second]=i;
    }
    set<pair<int,int>> L,R;
    L(i,0,2*n-1){
        int id=evs[i];
        if(vec[id].first==i){//entrou
            {
                auto pt=R.lower_bound({vec[id].first+1,0}); 
                if(pt!=R.end()){
                    auto[x,v]=*pt;
                    if(x<vec[id].second){
                        adj[v].push_back(id);
                        adj[id].push_back(v);
                    }
                }
                R.insert({vec[id].second,id});
            }
            {
                L.insert({i,id});
            }
        }else{
            {
                R.erase({i,id});
            }
            {
                auto pt=L.lower_bound({vec[id].first+1,0});
                if(pt!=L.end()){
                    auto[x,v]=*pt;
                    if(x<vec[id].second){
                        adj[v].push_back(id);
                        adj[id].push_back(v);
                    }
                }
                L.erase({vec[id].first,id});
            }
        }
    }


    vector<int> cor(n,-1);
    auto dfs=[&](auto&& self, int node)->void{
        for(auto a:adj[node]){
            if(cor[a]!=-1)continue;
            cor[a]=cor[node]^1;
            self(self,a);
        }
    };
    int resp=1;
    L(i,0,n-1){
        if(cor[i]==-1){
            cor[i]=0;
            resp*=2;
            resp%=MOD;
            dfs(dfs,i);
        }
    }

    stack<int> st[2];
    L(i,0,2*n-1){
        int id=evs[i];
        if(vec[id].first==i){//entra
            st[cor[id]].push(id);
        }else{
            if(st[cor[id]].top()!=id){
                cout<<0<<endl;return;
            }
            st[cor[id]].pop();
        }
    }
    cout<<resp<<endl;



}
 
int32_t main() {
    std::cin.tie(0)->sync_with_stdio(0); 
    std::cin.exceptions(std::cin.failbit);

    int T = 1;
//    std::cin >> T;
    while(T--) {
        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...