Submission #1177563

#TimeUsernameProblemLanguageResultExecution timeMemory
1177563ASN49KPort Facility (JOI17_port_facility)C++20
22 / 100
6091 ms21320 KiB
#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()

std::mt19937 rng(69);
#define UNUSED -1
const int N_MAX=200'000;
const int mod=1e9+7;
using i64=long long;


bool intersect(std::pair<int,int>a,std::pair<int,int>b)
{
    if(a.first>b.first)
    {
        std::swap(a,b);
    }
    return b.first<=a.second && a.second<=b.second;
}

int viz[N_MAX];
std::vector<int>adj[N_MAX];

void dfs(int nod,int val)
{
    if(viz[nod]!=-1)
    {
        return;
    }
    viz[nod]=val;
    for(auto &c:adj[nod])
    {
        dfs(c,val^1);
    }
}
int main()
{
    //freopen("input.txt","r",stdin);
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int n;
    std::cin>>n;
    std::vector<std::pair<int,int>>a(n);
    for(auto &c:a)
    {
        std::cin>>c.first>>c.second;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            if(intersect(a[i] , a[j]))
            {
                //std::cout<<i<<' '<<j<<'\n';
                adj[i].push_back(j);
                adj[j].push_back(i);
            }
        }
    }
    int rez=1;
    std::vector<i64>cash(2*n+1);
    for(auto &c:a)
    {
        cash[c.first]=cash[c.second]=rng();
    }
    std::set<int>mp;
    mp.insert(0);

    for(int i=1;i<=2*n;i++)
    {
        cash[i]^=cash[i-1];
        if(mp.count(cash[i]))
        {
             rez*=2;
             rez%=mod;
        }
        mp.insert(cash[i]);
    }



    std::fill(viz,viz+n,-1);
    for(int i=0;i<n;i++)
    {
        if(viz[i]==-1)
        {
            dfs(i,0);
        }
    }
    for(int i=0;i<n;i++)
    {
        for(auto &c:adj[i])
        {
            if(viz[i]==viz[c])
            {
                rez=0;
            }
        }
    }
    std::cout<<rez<<'\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...