Submission #1276335

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

const int MOD=1e9+7;

int fast_pow(int x, int p){
    if(p==0) return 1;
    if(p%2) return (fast_pow(x,p-1)*x)%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;
    set<int> st_rows;
    set<int> st_columns;
    vector<int> rows,columns;
    bool canROW=true;
    bool canCOLUMN=true;
    
    
    unordered_map<int,int> rowsI,columnsI;
    vector<pair<pair<int,int>,bool>> a(k);
    for (int i = 0; i < k; i++)
    {
        char c; cin >> c;
        if(c=='-') a[i].second=false;
        else a[i].second=true;
        cin >> a[i].first.first >> a[i].first.second;
        st_rows.insert(a[i].first.first);
        st_columns.insert(a[i].first.second);
    }
    int _j=0;
    for (auto u : st_rows) {
        rows.push_back(u);
        rowsI[u]=_j++;
    }
    _j=0;
    for (auto u : st_columns) {
        columns.push_back(u);
        columnsI[u]=_j++;
    }
    vector<int> rowsID(sz(rows),-1),columnsID(sz(columns),-1);

    for (int i = 0; i < k; i++)
    {
        int ri=(a[i].first.second+a[i].second)%2;
        int ci=(a[i].first.first+a[i].second)%2;
        if(rowsID[rowsI[a[i].first.first]]==-1) rowsID[rowsI[a[i].first.first]]=ri;
        if(rowsID[rowsI[a[i].first.first]]!=ri) canROW=false; 

        if(columnsID[columnsI[a[i].first.second]]==-1) columnsID[columnsI[a[i].first.second]]=ci;
        if(columnsID[columnsI[a[i].first.second]]!=ci) canCOLUMN=false; 
    }
    int sm=0;
    if(canROW){
        int rowSM=1;
        int l=0;
        for (int i = 0; i < sz(rows); i++)
        {
            rowSM=(rowSM*fast_pow(2,rows[i]-l-1));
            l=rows[i];
        }
        rowSM=(rowSM*fast_pow(2,n-l));
        sm+=rowSM;
    }
    if(canCOLUMN){
        int colSM=1;
        int l=0;
        for (int i = 0; i < sz(columns); i++)
        {
            colSM=(colSM*fast_pow(2,columns[i]-l-1));
            l=columns[i];
        }
        colSM=(colSM*fast_pow(2,m-l));
        sm+=colSM;
        sm%=MOD;
    }
    if(canROW&&canCOLUMN){
        bool cris1=true;
        bool cris2=true;
        for (int i = 0; i < sz(rows); i++)
        {
            cris1=cris1&&((rows[i]+rowsID[i])%2);
            cris2=cris2&&((rows[i]+rowsID[i])%2==0);
        }
        sm=(sm-cris1-cris2+MOD)%MOD;
    }
    cout << sm << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...