Submission #591661

#TimeUsernameProblemLanguageResultExecution timeMemory
591661MohammadAghilPlus Minus (BOI17_plusminus)C++17
100 / 100
238 ms25468 KiB
#include <iostream> #include <algorithm> #include <functional> #include <random> #include <cmath> #include <vector> #include <array> #include <set> #include <map> #include <queue> #include <cassert> #include <string> #include <bitset> #include <numeric> #include <iomanip> #include <limits.h> #include <tuple> using namespace std; #define rep(i,l,r) for(int i = l; i < (r); i++) #define per(i,r,l) for(int i = r; i >= (l); i--) #define sz(x) (int)size(x) #define pb push_back #define all(x) begin(x), end(x) #define ff first #define ss second typedef long long ll; typedef pair<int, int> pp; const ll mod = 1e9+7, maxn = 2e5 + 5, inf = ll(1e9) + 5, lg = 20; ll pw(ll a, ll b){ if(b == 0) return 1; ll k = pw(a, b>>1ll); return k*k%mod*(b&1ll?a:1ll)%mod; } map<int, vector<pair<int, bool>>> ver, hor; int n, m, k; vector<pair<bool, pp>> node; int chess_state(){ if(k == 0) return 2; for(auto[vl, p]: node) if(((vl^(p.ff + p.ss))&1) != ((node.back().ff^(node.back().ss.ff + node.back().ss.ss))&1)) return 0; return 1; } int hor_state(){ int exp = -1; bool dec = true; int cnt = 0; for(auto[y, v]: hor){ cnt++; pair<int, bool> ex = v.back(); int s = ((y + ex.ff)&1)^ex.ss; if(exp == -1) exp = s; else if(s != exp) dec = false; for(auto[x, vl]: v){ if((((x + y)&1)^vl) != s) return 0; } } ll ans = pw(2, n - cnt); if(dec) ans -= 1 + (k == 0); return (ans + mod)%mod; } int ver_state(){ int exp = -1; bool dec = true; int cnt = 0; for(auto[y, v]: ver){ cnt++; pair<int, bool> ex = v.back(); int s = ((y + ex.ff)&1)^ex.ss; if(exp == -1) exp = s; else if(s != exp) dec = false; for(auto[x, vl]: v){ if((((x + y)&1)^vl) != s) return 0; } } ll ans = pw(2, m - cnt); if(dec) ans -= 1 + (k == 0); return (ans + mod)%mod; } int main(){ cin.tie(0) -> sync_with_stdio(0); cin >> n >> m >> k; swap(n, m); rep(i,0,k){ char s; cin >> s; int x, y; cin >> x >> y; ver[x].pb({y, s == '+'}); hor[y].pb({x, s == '+'}); node.pb({s == '+', {x, y}}); } cout << (chess_state() + hor_state() + ver_state())%mod << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...