Submission #287518

#TimeUsernameProblemLanguageResultExecution timeMemory
287518infinite_iqSeats (IOI18_seats)C++14
25 / 100
4093 ms73720 KiB
#include <bits/stdc++.h>
using namespace std ;
#define fi first 
#define se second 
#define mid (l+r)/2 
#define le node*2 
#define ri node*2+1
typedef vector < int > vi ;
typedef pair < int , int > pi ;
#include "seats.h"
int N , n , m , crnt ;
int a [1000009] , b [1000009]  ;
pair < pi , pi > tree [4000009] ;
pair < pi , pi > merge ( pair < pi ,pi > x , pair < pi , pi > y ) {
        pair < pi , pi > ret ;
        ret .fi.fi = min ( x .fi.fi , y .fi.fi ) ;
        ret .fi.se = max ( x .fi.se , y .fi.se ) ;
        ret .se.fi = min ( x .se.fi , y .se.fi ) ;
        ret .se.se = max ( x .se.se , y .se.se ) ;
        return ret ;
}
void upd ( int node , int l , int r , int id ) {
        if ( l == r ) {
                tree [node] = { { a [l] , a [l] } , { b [l] , b [l] } } ;
                return ;
        }
        if ( id <= mid ) upd ( le , l , mid , id ) ;
        else upd ( ri , mid + 1 , r , id ) ;
        tree [node] = merge ( tree [le] , tree [ri] ) ;
}
pair < pi , pi > query ( int node , int l , int r , int s , int e ) {
        if ( s > r || e < l ) return { { 1e9 , 0 } , { 1e9 , 0 } } ;
        if ( s <= l && e >= r ) return tree [node] ;
        return merge ( query ( le , l , mid , s , e ) , query ( ri , mid + 1 , r , s , e ) ) ;
}
void give_initial_chart ( int H , int W , vi R, vi C ) {
        n = H , m = W , N = n * m ;
        for ( int i = 0 ; i < N ; i ++ ) {
                a [i] = R [i] ;
                b [i] = C [i] ;
                upd ( 1 , 0 , N -1 , i ) ;
        }
}
int swap_seats ( int x , int y ) {
        swap ( a [x] , a [y] ) ;
        swap ( b [x] , b [y] ) ;
        upd ( 1 , 0 , N - 1 , x ) ;
        upd ( 1 , 0 , N - 1 , y ) ;
        int r1 = 1e9 , r2 = 0 , c1 = 1e9 , c2 = 0 , ans = 0 ;
        for ( int i = 0 ; i < N ; i ++ ) {
                r1 = min ( r1 , a [i] ) ;
                r2 = max ( r2 , a [i] ) ;
                c1 = min ( c1 , b [i] ) ;
                c2 = max ( c2 , b [i] ) ;
                if ( ( r2 - r1 + 1 ) * ( c2 - c1 + 1 ) == i + 1 ) {
                        ans ++ ;
                        continue ;
                }
                int to = ( r2 - r1 + 1 ) * ( c2 - c1 + 1 ) - 1 ;
                pair < pi , pi > info = query ( 1 , 0 , N -1 , i , to ) ;
                r1 = min ( r1 , info .fi.fi ) ;
                r2 = max ( r2 , info .fi.se ) ;
                c1 = min ( c1 , info .se.fi ) ;
                c2 = max ( c2 , info .se.se ) ;
                i = to - 1 ;
        }
        return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...