Submission #1261316

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

#define int long long
using namespace std;

#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#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());

void solve() {
    int n;cin>>n;
    vector<int> pai(n);
    iota(all(pai),0);

    vector<int> ev(2*n);
    vector<int> ini(n);
    L(i,0,n-1){
        int a,b;cin>>a>>b;a--;b--;
        ev[a]=i;
        ev[b]=i;
        ini[i]=a;
    }

    vector<int> muda(n,0);
    vector<int> tam(n,1);
    auto find=[&](auto&& self, int node)->int{
        if(node==pai[node])return node;
        int x=self(self,pai[node]);
        muda[node]^=muda[pai[node]];
        pai[node]=x;
        return pai[node];
    };
    auto uni=[&](int a, int b)->bool{
        a=find(find,a);
        b=find(find,b);
        if(a==b){
            if(muda[a]==muda[b])return false;
            return true;
        }
        if(tam[a]<tam[b])swap(a,b);
        pai[b]=a;
        muda[b]=1;
        tam[a]+=tam[b];
        return true;
    };


    set<pair<int,int>> ativo;
    L(i,0,2*n-1){
        int at=ev[i];
        if(ativo.find({ini[at],at})==ativo.end()){
            ativo.insert({ini[at],at});
        }
        else{
            ativo.erase({ini[at],at});
            auto pt=ativo.lower_bound({ini[at],0});
            while(pt!=ativo.end()){
                int a=(*pt).second;
                if(!uni(at,a)){
                  cout<<0;return;
                }
                pt++;
            }
        }
    }
    vector<int> ehp(n,0);
    L(i,0,n-1){
        ehp[find(find,i)]=1;
    }
    const int MOD=1e9+7;
    int resp=1;
    L(i,0,n-1){
        if(ehp[i]){
            resp*=2;
            resp%=MOD;
        }
    }
    cout<<resp;return;



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