Submission #1101828

#TimeUsernameProblemLanguageResultExecution timeMemory
1101828irmuunPort Facility (JOI17_port_facility)C++17
100 / 100
3316 ms442744 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define ff first #define ss second #define all(s) s.begin(),s.end() #define rall(s) s.rbegin(),s.rend() const ll mod=1e9+7; struct segtree_max{ vector<pair<ll,ll>>d; segtree_max(ll n){ d.resize(4*n); build(1,1,n); } void build(ll node,ll l,ll r){ if(l==r){ d[node]={-1e18,-1e18}; return; } ll mid=(l+r)/2; build(node*2,l,mid); build(node*2+1,mid+1,r); d[node]=max(d[node*2],d[node*2+1]); } pair<ll,ll>query(ll node,ll l,ll r,ll L,ll R){ if(l > R || r < L || L > R){ return {-1e18,-1e18}; } if(L <= l && r <= R){ return d[node]; } ll mid=(l+r)/2; return max(query(node*2,l,mid,L,R),query(node*2+1,mid+1,r,L,R)); } void update(ll node,ll l,ll r,ll L,ll R,ll i){ if(l>L || r<L)return; if(l==r){ d[node]={R,i}; return; } ll mid=(l+r)/2; update(node*2,l,mid,L,R,i); update(node*2+1,mid+1,r,L,R,i); d[node]=max(d[node*2],d[node*2+1]); } }; struct segtree_min{ vector<pair<ll,ll>>d; segtree_min(ll n){ d.resize(4*n); build(1,1,n); } void build(ll node,ll l,ll r){ if(l==r){ d[node]={1e18,1e18}; return; } ll mid=(l+r)/2; build(node*2,l,mid); build(node*2+1,mid+1,r); d[node]=min(d[node*2],d[node*2+1]); } pair<ll,ll>query(ll node,ll l,ll r,ll L,ll R){ if(l > R || r < L || L > R){ return {1e18,1e18}; } if(L <= l && r <= R){ return d[node]; } ll mid=(l+r)/2; return min(query(node*2,l,mid,L,R),query(node*2+1,mid+1,r,L,R)); } void update(ll node,ll l,ll r,ll L,ll R,ll i){ if(l>L || r<L)return; if(l==r){ d[node]={R,i}; return; } ll mid=(l+r)/2; update(node*2,l,mid,L,R,i); update(node*2+1,mid+1,r,L,R,i); d[node]=min(d[node*2],d[node*2+1]); } }; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll n; cin>>n; vector<ll>a(n+1),b(n+1); for(ll i=1;i<=n;i++){ cin>>a[i]>>b[i]; } segtree_min smn(2*n); segtree_max smx(2*n); for(ll i=1;i<=n;i++){ smn.update(1,1,2*n,a[i],b[i],i); smx.update(1,1,2*n,a[i],b[i],i); smn.update(1,1,2*n,b[i],a[i],i); smx.update(1,1,2*n,b[i],a[i],i); } vector<vector<ll>>g(n+1); for(ll i=1;i<=n;i++){ auto mn=smn.query(1,1,2*n,a[i]+1,b[i]-1),mx=smx.query(1,1,2*n,a[i]+1,b[i]-1); if(mn.ff<a[i]) g[mn.ss].pb(i), g[i].pb(mn.ss); if(mx.ff>b[i]) g[mx.ss].pb(i), g[i].pb(mx.ss); } vector<ll>col(n+1,-1); ll ans=1; function <void(ll)> dfs=[&](ll x){ for(ll y:g[x]){ if(col[y]==-1){ col[y]=1-col[x]; dfs(y); } if(col[x]==col[y]){ ans=0; } } }; for(ll i=1;i<=n;i++){ if(col[i]==-1){ ans=ans*2%mod; col[i]=0; dfs(i); } } cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...