Submission #1187749

#TimeUsernameProblemLanguageResultExecution timeMemory
1187749LudisseyPlus Minus (BOI17_plusminus)C++20
12 / 100
1 ms584 KiB
#include <bits/stdc++.h>
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
using namespace std;

const int MOD=1e9+7;

struct point {
    int s;
    int x,y;
    point() {}
    point(char c, int a, int b){
        if(c=='+') s=1;
        else s=0;
        y=a-1;
        x=b-1;
    }
};

int fast_pow(int x, int p){
    if(p==0) return 1;
    if(p==1) return x;
    if(p%2) return (x*fast_pow(x,p-1))%MOD;
    else {
        int fp=fast_pow(x,p/2);
        return (fp*fp)%MOD;
    }
}

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int N,M,K; cin >> N >> M >> K;
    map<int,int> canHdouble;
    map<int,int> canVdouble;
    vector<point> points(K);
    set<pair<int,int>> st[2];
    set<int> rem[2];
    int R=N;
    int C=M;
    bool checkerP=true;
    bool checkerN=true;
    for (int i = 0; i < K; i++)
    {
        char c; cin >> c;
        int a,b; cin >> a >> b;
        points[i]=point(c,a,b);
        int x=points[i].x, y=points[i].y;

        if (canHdouble[points[i].y]==0) canHdouble[points[i].y]=(points[i].x+points[i].s)%2+1;
        else if(canHdouble[points[i].y]!=(points[i].x+points[i].s)%2+1) canHdouble[points[i].y]=-2;

        if (canVdouble[points[i].x]==0) canVdouble[points[i].x]=(points[i].y+points[i].s)%2+1;
        else if(canVdouble[points[i].x]!=(points[i].y+points[i].s)%2+1) canVdouble[points[i].x]=-2;
        st[points[i].s].insert({x,y});
        
        if((x+y)%2!=points[i].s) checkerN=false;
        if((x+y)%2==points[i].s) checkerP=false;

        if(rem[0].find(x)==rem[0].end()){
            rem[0].insert(x);
            C--;
        }
        if(rem[1].find(y)==rem[1].end()){
            rem[1].insert(y);
            R--;
        }
    }
    bool cV=true;
    bool cH=true;
    bool c0=true;
    for (int i = 0; i < K; i++)
    {
        int x=points[i].x, y=points[i].y;
        if(x==0) c0=false;
        if(y==0) c0=false;
        if(st[points[i].s].find({x+1,y})!=st[points[i].s].end()||st[points[i].s].find({x-1,y})!=st[points[i].s].end()){
            cV=false;
            if(canVdouble[x]==-2){
                cout << 0 << "\n";
                return 0;
            }
        }
        if(st[points[i].s].find({x,y+1})!=st[points[i].s].end()||st[points[i].s].find({x,y-1})!=st[points[i].s].end()){
            cH=false;
            if(canHdouble[y]==-2){
                cout << 0 << "\n";
                return 0;
            }
        }
    }
    int cb=-1;
    for (int i = 0; i < K; i++)
    {
        int x=points[i].x, y=points[i].y;
        if(x==0) c0=false;
        if(y==0) c0=false;
        if(st[1-points[i].s].find({x+1,y+1})!=st[1-points[i].s].end()){
            if((canVdouble[x]==-2||canVdouble[x+1]==-2)&&(canHdouble[y]==-2||canHdouble[y+1]==-2)){
                cout << 0 << "\n";
                return 0;
            }else if(canVdouble[x]==-2||canVdouble[x+1]==-2){
                cV=true;
                cb=-2;
            } else if(canHdouble[y]==-2||canHdouble[y+1]==-2){
                cH=true;
                cb=-2;
            } else if(cb==-1){
                cb=1;
            }
        }
        if(st[1-points[i].s].find({x-1,y+1})!=st[1-points[i].s].end()){
            if((canVdouble[x]==-2||canVdouble[x-1]==-2)&&(canHdouble[y]==-2||canHdouble[y+1]==-2)){
                cout << 0 << "\n";
                return 0;
            }else if(canVdouble[x]==-2||canVdouble[x-1]==-2){
                cV=true;
                cb=-2;
            } else if(canHdouble[y]==-2||canHdouble[y+1]==-2){
                cH=true;
                cb=-2;
            }else if(cb==-1){
                cb=1;
            }
        }
    }
    int sum=(int)checkerN+(int)checkerP+(fast_pow(2,R)-(int)(cH));
    if(!cH&&!cV) sum=0;
    else if(!cV){
        sum=fast_pow(2,C);
    }else if(!cH){
        sum=fast_pow(2,R);
    }else if(cb==1){
        sum=fast_pow(2,R)+fast_pow(2,C);
    }else{
        sum=(int)checkerN+(int)checkerP+fast_pow(2,R)+fast_pow(2,C)-2-2*(R+C==N+M);
        cerr<<"hello";
    }
    cout << sum << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...