제출 #1370625

#제출 시각아이디문제언어결과실행 시간메모리
1370625eradaxPlus Minus (BOI17_plusminus)C++20
100 / 100
24 ms2224 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const ll mod=1e9l+7;
int main(){
    cin.tie(0)->sync_with_stdio(0);
    auto pow=[](ll b, ll e){
        ll r=1;
        while(e){
            if(e&1)r=r*b%mod;
            b=b*b%mod;
            e/=2;
        }
        return r;
    };

    int n,m,k;cin>>n>>m>>k;

    int v1=1,v2=1;

    vector<pair<int,int>> xs,ys;

    for(int i=0;i<k;i++){
        char c;
        int x,y;
        cin>>c>>y>>x;
        x--,y--,c=c=='+';
        
        v1&=(x+y)%2!=c;
        v2&=(x+y)%2==c;

        xs.push_back({x,(c+y)&1});
        ys.push_back({y,(c+x)&1});
    }

    sort(begin(xs),end(xs));
    sort(begin(ys),end(ys));

    int fx=ssize(xs)>0,fy=ssize(ys)>0;
    for(int i=0;i<ssize(xs)-1;i++)fx+=xs[i].first!=xs[i+1].first;
    for(int i=0;i<ssize(ys)-1;i++)fy+=ys[i].first!=ys[i+1].first;
    for(int i=0;i<ssize(xs)-1;i++)if(xs[i].first==xs[i+1].first&&xs[i].second!=xs[i+1].second)fx=-1;
    for(int i=0;i<ssize(ys)-1;i++)if(ys[i].first==ys[i+1].first&&ys[i].second!=ys[i+1].second)fy=-1;
    fx=m-fx;
    fy=n-fy;

    ll ans=0;
    if(fx<=m)ans=(ans+pow(2,fx))%mod;
    if(fy<=n)ans=(ans+pow(2,fy))%mod;
    ans=(ans+mod-v1-v2)%mod;
    cout<<ans<<'\n';
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…