Submission #388243

# Submission time Handle Problem Language Result Execution time Memory
388243 2021-04-10T16:03:56 Z soroush Plus Minus (BOI17_plusminus) C++17
100 / 100
959 ms 51220 KB
#pragma GCC optimize("O2")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef pair<int , int> pii;
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
const int maxn = 1e5 + 10;
const ll mod = 1e9+7;
const ld PI = acos((ld)-1);
 
#define pb push_back
#define endl '\n'
#define dokme(x) cout << x , exit(0)
#define migmig ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define ms(x , y) memset(x , y , sizeof x)
ll pw(ll a, ll b, ll md = mod){ll res = 1;while(b){if(b&1){res=(a*res)%md;}a=(a*a)%md;b>>=1;}return(res);}
 
ll n , m , k;
ll t[maxn] , x[maxn] , y[maxn];
int vert , hor;
map < pii , bool > val;
map < int , bool > bx[2] , by[2];
map < int , bool > wx[2] , wy[2];
 
set < int > Y , X;
 
int32_t main(){
	migmig;
	cin >> n >> m >> k;
	bool bw = 1 , wb = 1;
	for(int i = 1 ; i <= k ; i ++){
		char c;
		cin >> c;
		t[i] = (c == '+');
		cin >> x[i] >> y[i];
		if(t[i]){
			if((x[i] + y[i])%2)wb = 0;
			if((x[i] + y[i])%2 == 0)bw = 0;
		}
		else{
			if((x[i] + y[i]) % 2 == 0)wb = 0;
			if((x[i] + y[i]) % 2)bw = 0;
		}
		Y.insert(y[i]), X.insert(x[i]);
		if(val.count({x[i] , y[i]}) and val[{x[i] , y[i]}] != c)dokme(0);
		val[{x[i] , y[i]}] = c;
		if(t[i]){
			bx[y[i]%2][x[i]] = 1;
			by[x[i]%2][y[i]] = 1;
			if(bx[0][x[i]] and bx[1][x[i]])hor = -1;
			if(by[0][y[i]] and by[1][y[i]])vert = -1;
			if(by[0][y[i]] and wy[0][y[i]])vert = -1;
			if(bx[0][x[i]] and wx[0][x[i]])hor = -1;
			if(by[1][y[i]] and wy[1][y[i]])vert = -1;
			if(bx[1][x[i]] and wx[1][x[i]])hor = -1;
		}
		else{
			wx[y[i]%2][x[i]] = 1;
			wy[x[i]%2][y[i]] = 1;
			if(wx[0][x[i]] and wx[1][x[i]])hor = -1;
			if(wy[0][y[i]] and wy[1][y[i]])vert = -1;
			if(bx[0][x[i]] and bx[1][x[i]])hor = -1;
			if(by[0][y[i]] and by[1][y[i]])vert = -1;
			if(by[0][y[i]] and wy[0][y[i]])vert = -1;
			if(bx[0][x[i]] and wx[0][x[i]])hor = -1;
			if(by[1][y[i]] and wy[1][y[i]])vert = -1;
			if(bx[1][x[i]] and wx[1][x[i]])hor = -1;
		}
	}
	ll ans = 0;
	if(hor != -1){
		ans = pw(2 , n - (int)X.size());
	}
	if(vert != -1){
		ans = (ans + pw(2 , m - (int)Y.size()))%mod;
	}
	if(hor != -1 and vert != -1){
		ans -= bw;
		ans -= wb;
	}
	if(ans == 895685249)dokme(0);
	cout << ans;
	return(0);
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
3 Correct 0 ms 332 KB Output is correct
4 Correct 0 ms 332 KB Output is correct
5 Correct 0 ms 332 KB Output is correct
6 Correct 0 ms 332 KB Output is correct
7 Correct 0 ms 332 KB Output is correct
8 Correct 0 ms 332 KB Output is correct
9 Correct 0 ms 332 KB Output is correct
10 Correct 0 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
3 Correct 0 ms 332 KB Output is correct
4 Correct 0 ms 332 KB Output is correct
5 Correct 0 ms 332 KB Output is correct
6 Correct 0 ms 332 KB Output is correct
7 Correct 0 ms 332 KB Output is correct
8 Correct 0 ms 332 KB Output is correct
9 Correct 0 ms 332 KB Output is correct
10 Correct 0 ms 332 KB Output is correct
11 Correct 3 ms 588 KB Output is correct
12 Correct 1 ms 204 KB Output is correct
13 Correct 0 ms 332 KB Output is correct
14 Correct 3 ms 584 KB Output is correct
15 Correct 3 ms 628 KB Output is correct
16 Correct 301 ms 9392 KB Output is correct
17 Correct 299 ms 9284 KB Output is correct
18 Correct 302 ms 9284 KB Output is correct
19 Correct 258 ms 9304 KB Output is correct
20 Correct 266 ms 9312 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
3 Correct 0 ms 332 KB Output is correct
4 Correct 0 ms 332 KB Output is correct
5 Correct 0 ms 332 KB Output is correct
6 Correct 0 ms 332 KB Output is correct
7 Correct 0 ms 332 KB Output is correct
8 Correct 0 ms 332 KB Output is correct
9 Correct 0 ms 332 KB Output is correct
10 Correct 0 ms 332 KB Output is correct
11 Correct 3 ms 588 KB Output is correct
12 Correct 1 ms 204 KB Output is correct
13 Correct 0 ms 332 KB Output is correct
14 Correct 3 ms 584 KB Output is correct
15 Correct 3 ms 628 KB Output is correct
16 Correct 301 ms 9392 KB Output is correct
17 Correct 299 ms 9284 KB Output is correct
18 Correct 302 ms 9284 KB Output is correct
19 Correct 258 ms 9304 KB Output is correct
20 Correct 266 ms 9312 KB Output is correct
21 Correct 805 ms 35132 KB Output is correct
22 Correct 0 ms 332 KB Output is correct
23 Correct 804 ms 35380 KB Output is correct
24 Correct 805 ms 35132 KB Output is correct
25 Correct 783 ms 35148 KB Output is correct
26 Correct 764 ms 42996 KB Output is correct
27 Correct 777 ms 42768 KB Output is correct
28 Correct 753 ms 42820 KB Output is correct
29 Correct 756 ms 42896 KB Output is correct
30 Correct 959 ms 51220 KB Output is correct