Submission #860688

#TimeUsernameProblemLanguageResultExecution timeMemory
860688Iliya_Plus Minus (BOI17_plusminus)C++17
100 / 100
136 ms24404 KiB
//IN THE NAME OF GOD
#include<bits/stdc++.h>
#pragma GCC optimize("O2,unroll-loops")
#define endl '\n'
#define F first
#define S second
using namespace std;
typedef long long ll; 

const ll mod = 1e9+7; 
map<ll,vector<pair<ll,char>>> r, c; 

ll power(ll a, ll b){
     if (b == 0) return 1ll;
     ll c = power(a,b/2);
     return 1ll*c*c%mod*(b&1?a:1)%mod;
}

int32_t main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

     ll n,m,k; cin >> n >> m >> k; 
     bool can1 = true, can2 = true;
     for(ll i=1; i<=k; i++){
          char val; cin >> val; 
          ll x,y; cin >> x >> y; 
          if ((((x+y)%2) == 0 && val == '-') || (((x+y)%2) == 1 && val == '+')) can1 = false;  
          if ((((x+y)%2) == 1 && val == '-') || (((x+y)%2) == 0 && val == '+')) can2 = false;  
          r[x].push_back({y,val});
          c[y].push_back({x,val}); 
     }
     ll ans = 0; 
     bool ok = true; 
     for(pair<ll,vector<pair<ll,char>>> cur : r){
          sort(cur.S.begin(),cur.S.end());
          for(ll i=1; i<ll(cur.S.size()); i++){
               if (cur.S[i].S == cur.S[i-1].S && ((cur.S[i].F - cur.S[i-1].F)%2) == 1) ok = false; 
               if (cur.S[i].S != cur.S[i-1].S && ((cur.S[i].F - cur.S[i-1].F)%2) == 0) ok = false; 
          }
     }
     if (ok) ans = (ans + power(2,n-ll(r.size())))%mod;
     ok = true; 
     for(pair<ll,vector<pair<ll,char>>> cur : c){
          sort(cur.S.begin(),cur.S.end());
          for(ll i=1; i<ll(cur.S.size()); i++){
               if (cur.S[i].S == cur.S[i-1].S && ((cur.S[i].F - cur.S[i-1].F)%2) == 1) ok = false; 
               if (cur.S[i].S != cur.S[i-1].S && ((cur.S[i].F - cur.S[i-1].F)%2) == 0) ok = false; 
          }
     }
     if (ok) ans = (ans + power(2,m-ll(c.size())))%mod;
     ans = (ans + mod - can1) % mod; 
     ans = (ans + mod - can2) % mod;
     cout << ans << endl;

     return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...