Submission #629700

#TimeUsernameProblemLanguageResultExecution timeMemory
629700chonkaPlus Minus (BOI17_plusminus)C++17
100 / 100
136 ms11924 KiB
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
// mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());

const int MOD = 1e9 + 7 ;

ll fastpow ( ll x , ll pw ) {
    ll ret = 1 ;
    while ( pw > 0 ) {
        if ( ( pw % 2 ) == 0 ) {
            x = ( x * x ) % MOD ;
            pw /= 2 ;
        }
        else {
            ret = ( ret * x ) % MOD ;
            -- pw ;
        }
    }
    return ret ;
}

int n , m , k ;
map < int , int > wr , wc ;

void solve ( ) {
    cin >> n >> m >> k ;
    int rem_rows = n , rem_cols = m ;
    bool bad_row = false , bad_col = false ;
    bool ch1 = true , ch2 = true ;
    for ( int i = 1 ; i <= k ; ++ i ) {
        char c ; cin >> c ;
        int val = ( c == '+' ) ;
        int x , y ; cin >> x >> y ;
        int hh_row = ( 1 << ( ( y % 2 ) ^ val ) ) ;
        if ( wr[ x ] == 0 ) { -- rem_rows ; }
        wr[ x ] |= hh_row ;
        if ( wr[ x ] == 3 ) { bad_row = true ; }

        int hh_col = ( 1 << ( ( x % 2 ) ^ val ) ) ;
        if ( wc[ y ] == 0 ) { -- rem_cols ; }
        wc[ y ] |= hh_col ;
        if ( wc[ y ] == 3 ) { bad_col = true ; }

        if ( ( x + y ) % 2 == 0 ) {
            if ( val == 1 ) { ch1 = false ; }
            else { ch2 = false ; }
        }
        else {
            if ( val == 1 ) { ch2 = false ; }
            else { ch1 = false ; }
        }
    }
    ll ans = 0 ;
    if ( bad_row == false ) {
        ans += fastpow ( 2 , rem_rows ) ;
    }
    if ( bad_col == false ) {
        ans += fastpow ( 2 , rem_cols ) ;
    }
    if ( bad_row == false && bad_col == false ) {
        if ( ch1 == true ) { ans = ( ans - 1 + MOD ) % MOD ; }
        if ( ch2 == true ) { ans = ( ans - 1 + MOD ) % MOD ; }
    }
    cout << ans << "\n" ;
}

int main ( ) {
    ios_base :: sync_with_stdio ( false ) ;
    cin.tie ( NULL ) ;
    int t = 1 ; // 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...