#include <bits/stdc++.h>
#define DIMN 100010
#define MOD 1000000007
using namespace std;
int n , m , k , unk;
map <int,int> f , par_plus , par_minus ,par_plus_c , par_minus_c;
int x[DIMN] , s[DIMN] , y[DIMN];
int check (){
int i;
/// vezi reseturi
f.clear();
par_plus.clear();
par_minus.clear();
unk = n;
for (i=1;i<=k;i++){ /// vrei ca liniile sa fie alternante
if (!f[x[i]]){
f[x[i]] = 1;
unk--;
}
if (s[i] == 1){
if (par_plus[x[i]] == 0){ /// nu ai fixat , e prima oara cand accesezi lin
par_plus[x[i]] = 1 + y[i] % 2;
}
else {
if (par_plus[x[i]] - 1 != y[i]%2){
return 0; /// incerci sa pui un plus prost
}
}
}
else {
if (par_minus[x[i]] == 0){ /// nu ai fixat , e prima oara cand accesezi lin
par_minus[x[i]] = 1 + y[i] % 2;
}
else {
if (par_minus[x[i]] - 1 != y[i]%2){
return 0; /// incerci sa pui un plus prost
}
}
}
if (par_plus[x[i]] && par_minus[x[i]] && par_plus[x[i]] == par_minus[x[i]])
return 0;
}
return 1;
}
int both (){
int i;
/// vezi reseturi
par_plus.clear();
par_minus.clear();
for (i=1;i<=k;i++){ /// vrei ca liniile sa fie alternante
if (s[i] == 1){
if (par_plus[x[i] % 2] == 0){ /// nu ai fixat , e prima oara cand accesezi lin
par_plus[x[i] % 2] = 1 + y[i] % 2;
}
else {
if (par_plus[x[i] % 2] - 1 != y[i]%2){
return 0; /// incerci sa pui un plus prost
}
}
}
else {
if (par_minus[x[i] % 2] == 0){ /// nu ai fixat , e prima oara cand accesezi lin
par_minus[x[i] % 2] = 1 + y[i] % 2;
}
else {
if (par_minus[x[i] % 2] - 1 != y[i]%2){
return 0; /// incerci sa pui un plus prost
}
}
}
if (par_plus[x[i] % 2] && par_minus[x[i] % 2] && par_plus[x[i] % 2] == par_minus[x[i] % 2])
return 0;
}
return 1;
}
int main()
{
FILE *fin = stdin;
FILE *fout = stdout;
int i , sum = 0 , ok = 0;
char c;
fscanf (fin,"%d%d%d\n",&n,&m,&k);
for (i=1;i<=k;i++){
c = fgetc (fin);
if (c == '-')
s[i] = -1;
else s[i] = 1;
fscanf (fin,"%d%d\n",&x[i],&y[i]);
}
/// verifica daca linia poate fi alternanta
if (check()){
int nr = 1;
int aux = 2;
while (unk){
if (unk % 2)
nr = ((long long)nr * aux)%MOD;
aux = ((long long)aux * aux)%MOD;
unk/=2;
}
sum = nr;
ok++;
}
/// altfel , verifica daca coloana poate fi alternanta
for (i=1;i<=k;i++){
swap(x[i] , y[i]);
}
swap(n , m);
if (check()){
int nr = 1;
int aux = 2;
while (unk){
if (unk % 2)
nr = ((long long)nr * aux)%MOD;
aux = ((long long)aux * aux)%MOD;
unk/=2;
}
sum = (sum + nr)%MOD;
ok++;
}
if (k == 0){
fprintf (fout,"%d",sum-2);
return 0;
}
/// altfel ai linie inv linie inv SAU imposibil
if (ok == 2){ /// scade 1 daca pot fi si liniile si col alternante in AC timp
for (i=1;i<=k;i++){
swap(x[i] , y[i]);
}
swap(n , m);
sum-=both();
sum = (sum + MOD)%MOD;
}
if (!ok)
fprintf (fout,"0");
else fprintf (fout,"%d",sum);
return 0;
}
Compilation message
plusminus.cpp: In function 'int main()':
plusminus.cpp:89:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
fscanf (fin,"%d%d%d\n",&n,&m,&k);
~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
plusminus.cpp:95:16: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
fscanf (fin,"%d%d\n",&x[i],&y[i]);
~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
400 KB |
Output is correct |
3 |
Correct |
2 ms |
256 KB |
Output is correct |
4 |
Correct |
2 ms |
376 KB |
Output is correct |
5 |
Correct |
2 ms |
376 KB |
Output is correct |
6 |
Correct |
2 ms |
376 KB |
Output is correct |
7 |
Correct |
2 ms |
376 KB |
Output is correct |
8 |
Correct |
2 ms |
376 KB |
Output is correct |
9 |
Correct |
2 ms |
376 KB |
Output is correct |
10 |
Correct |
0 ms |
376 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
400 KB |
Output is correct |
3 |
Correct |
2 ms |
256 KB |
Output is correct |
4 |
Correct |
2 ms |
376 KB |
Output is correct |
5 |
Correct |
2 ms |
376 KB |
Output is correct |
6 |
Correct |
2 ms |
376 KB |
Output is correct |
7 |
Correct |
2 ms |
376 KB |
Output is correct |
8 |
Correct |
2 ms |
376 KB |
Output is correct |
9 |
Correct |
2 ms |
376 KB |
Output is correct |
10 |
Correct |
0 ms |
376 KB |
Output is correct |
11 |
Correct |
4 ms |
376 KB |
Output is correct |
12 |
Correct |
2 ms |
376 KB |
Output is correct |
13 |
Correct |
0 ms |
376 KB |
Output is correct |
14 |
Correct |
2 ms |
376 KB |
Output is correct |
15 |
Correct |
3 ms |
376 KB |
Output is correct |
16 |
Correct |
28 ms |
2552 KB |
Output is correct |
17 |
Correct |
25 ms |
2424 KB |
Output is correct |
18 |
Correct |
25 ms |
2428 KB |
Output is correct |
19 |
Correct |
141 ms |
2680 KB |
Output is correct |
20 |
Correct |
141 ms |
2680 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
400 KB |
Output is correct |
3 |
Correct |
2 ms |
256 KB |
Output is correct |
4 |
Correct |
2 ms |
376 KB |
Output is correct |
5 |
Correct |
2 ms |
376 KB |
Output is correct |
6 |
Correct |
2 ms |
376 KB |
Output is correct |
7 |
Correct |
2 ms |
376 KB |
Output is correct |
8 |
Correct |
2 ms |
376 KB |
Output is correct |
9 |
Correct |
2 ms |
376 KB |
Output is correct |
10 |
Correct |
0 ms |
376 KB |
Output is correct |
11 |
Correct |
4 ms |
376 KB |
Output is correct |
12 |
Correct |
2 ms |
376 KB |
Output is correct |
13 |
Correct |
0 ms |
376 KB |
Output is correct |
14 |
Correct |
2 ms |
376 KB |
Output is correct |
15 |
Correct |
3 ms |
376 KB |
Output is correct |
16 |
Correct |
28 ms |
2552 KB |
Output is correct |
17 |
Correct |
25 ms |
2424 KB |
Output is correct |
18 |
Correct |
25 ms |
2428 KB |
Output is correct |
19 |
Correct |
141 ms |
2680 KB |
Output is correct |
20 |
Correct |
141 ms |
2680 KB |
Output is correct |
21 |
Correct |
432 ms |
11484 KB |
Output is correct |
22 |
Correct |
2 ms |
376 KB |
Output is correct |
23 |
Correct |
32 ms |
2936 KB |
Output is correct |
24 |
Correct |
32 ms |
2936 KB |
Output is correct |
25 |
Correct |
30 ms |
2936 KB |
Output is correct |
26 |
Correct |
295 ms |
11484 KB |
Output is correct |
27 |
Correct |
316 ms |
10488 KB |
Output is correct |
28 |
Correct |
291 ms |
12280 KB |
Output is correct |
29 |
Correct |
457 ms |
14968 KB |
Output is correct |
30 |
Correct |
583 ms |
17784 KB |
Output is correct |