Submission #333754

#TimeUsernameProblemLanguageResultExecution timeMemory
333754CaroLindaPort Facility (JOI17_port_facility)C++14
100 / 100
3708 ms133932 KiB
#include <bits/stdc++.h> /* Entre tanta gente yo te vi llegar Algo en el destino me hizo saludar Te dije me nombre e no sé dónde Como con un beso me respondes */ #define debug printf #define all(x) x.begin(),x.end() #define sz(x) (int)(x.size()) #define ll long long const int MAX = 2e6+10 ; const int MOD = 1e9+7 ; using namespace std ; int N ; int L[MAX] , R[MAX] ; int saveL[MAX], saveR[MAX] ; int beginsHere[MAX], endsHere[MAX] ; struct Seg { //Seg zero means I'm searching i s.t. L[i] < L int type ; int tree[MAX*4] ; int m(int l, int r ) { return (l+r)>>1 ; } int merge(int type , int lef, int rig) { if( !type ) return ( L[lef ]< L[rig] ) ? lef : rig ; return (R[lef] >R[rig] ) ? lef : rig ; } void build(int pos, int l, int r ) { if( l == r ) { tree[pos] = type ? beginsHere[l] : endsHere[r] ; return ; } build(pos<<1 , l , m(l,r) ) ; build(pos<<1|1 , m(l,r)+1, r ) ; tree[pos] = merge(type, tree[pos<<1], tree[pos<<1|1] ) ; } void makeRemoval(int pos, int l, int r, int x ) { if( l == r ) return ; if( x <= m(l,r) ) makeRemoval(pos<<1 , l , m(l,r) , x ) ; else makeRemoval(pos<<1|1 , m(l,r)+1, r, x ) ; tree[pos] = merge(type, tree[pos<<1], tree[pos<<1|1] ) ; } int qry(int pos, int l, int r, int beg, int en ) { // debug("%d %d and look for %d %d and ans %d\n", l, r, beg, en, tree[pos] ) ; if( l > en || r < beg ) return 0 ; if( l >= beg && r <= en ) return tree[pos] ; int al = qry(pos<<1 , l , m(l,r) , beg, en ) ; int ar = qry(pos<<1|1 , m(l,r)+1, r, beg, en ) ; return merge(type, al, ar ) ; } } seg[2] ; int main() { seg[0].type = 0 ; seg[1].type = 1 ; scanf("%d", &N ) ; for(int i= 1 ; i <= N ; i++ ) { scanf("%d %d", &L[i] , &R[i] ) ; saveL[i] = L[i] ; saveR[i] = R[i] ; beginsHere[ L[i] ] = i ; endsHere[ R[i] ] = i ; } L[0] = 2*N+1 ; R[0] = -1 ; seg[0].build(1,1,2*N) ; seg[1].build(1,1,2*N) ; vector<int> color(N+1,-1) ; color[0] = 0 ; int ans= 1 ; for(int i= 1 ; i <= N ; i++ ) { if( color[i] != -1 ) continue ; ans <<= 1 ; if(ans >= MOD ) ans -= MOD ; vector<int> fila(1,i) ; color[i] = 0 ; int ini = 0 ; L[i] = 2*N+1 ; R[i] = -1 ; seg[0].makeRemoval(1,1,2*N, saveR[i] ) ; seg[1].makeRemoval(1,1,2*N, saveL[i] ) ; while( ini < sz(fila) ) { int x = fila[ini++] ; int y; for(int j = 0 ; j < 2 ; j++ ) { y = seg[j].qry(1,1,2*N, saveL[x] , saveR[x] ) ; while( color[y] == -1 && ( (!j && L[y] < saveL[x]) || (j && R[y] > saveR[x] ) ) ) { color[y] = !color[x] ; L[y] = 2*N+1 ; R[y] = -1 ; seg[0].makeRemoval(1,1,2*N, saveR[y] ) ; seg[1].makeRemoval(1,1,2*N, saveL[y] ) ; fila.push_back(y) ; y = seg[j].qry( 1, 1, 2*N, saveL[x], saveR[x] ) ; } } } } vector<int> toSort(N) ; iota(all(toSort),1) ; sort( all(toSort), [&](int i, int j) { return saveL[i] < saveL[j] ; } ) ; set<int> s[2] ; for(auto e : toSort ) { int c = color[e] ; auto it = s[c].upper_bound(saveR[e]) ; if(it != s[c].begin() ) { it-- ; if( *it > saveL[e] ) { printf("0\n" ) ; return 0 ; } } s[c].insert(saveR[e] ) ; } printf("%d\n", ans ) ; }

Compilation message (stderr)

port_facility.cpp: In function 'int main()':
port_facility.cpp:88:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   88 |  scanf("%d", &N ) ;
      |  ~~~~~^~~~~~~~~~~
port_facility.cpp:91:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   91 |   scanf("%d %d", &L[i] , &R[i] ) ;
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...