結果
問題 | No.2476 Knight Game |
ユーザー | beet |
提出日時 | 2023-09-16 16:45:07 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 104 ms / 2,000 ms |
コード長 | 2,510 bytes |
コンパイル時間 | 2,062 ms |
コンパイル使用メモリ | 209,808 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-03 16:42:33 |
合計ジャッジ時間 | 3,770 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 83 ms
6,940 KB |
testcase_02 | AC | 104 ms
6,940 KB |
testcase_03 | AC | 104 ms
6,940 KB |
testcase_04 | AC | 103 ms
6,940 KB |
testcase_05 | AC | 104 ms
6,944 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using Int = long long; const char newl = '\n'; template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;} template<typename T> void drop(const T &x){cout<<x<<endl;exit(0);} template<typename T=int> vector<T> read(size_t n){ vector<T> ts(n); for(size_t i=0;i<n;i++) cin>>ts[i]; return ts; } template<typename F> struct FixPoint : F{ FixPoint(F&& f):F(forward<F>(f)){} template<typename... Args> decltype(auto) operator()(Args&&... args) const{ return F::operator()(*this,forward<Args>(args)...); } }; template<typename F> inline decltype(auto) MFP(F&& f){ return FixPoint<F>{forward<F>(f)}; } //INSERT ABOVE HERE signed main(){ cin.tie(0); ios::sync_with_stdio(0); int cases; cin>>cases; while(cases--){ int h,w; using ll = long long; using T = tuple<ll, int, int>; map<T, int> memo; int di[]={+1,+1,-1,-1,+2,+2,-2,-2}; int dj[]={+2,-2,+2,-2,+1,-1,+1,-1}; auto get_bit=[&](int i,int j){return 1LL<<(i*w+j);}; auto dfs=MFP([&](auto dfs,ll bit,int i,int j)->int{ if(memo.count(T(bit,i,j))) return memo.at(T(bit,i,j)); int& res=memo[T(bit,i,j)]; res=0; for(int k=0;k<8;k++){ int ni=i+di[k]; int nj=j+dj[k]; if(0<=ni and ni<h and 0<=nj and nj<w){ ll nbit=bit|get_bit(ni,nj); if(nbit==bit) continue; res|=!dfs(nbit,ni,nj); } if(res) return res; } return res; }); auto calc=[&](int r,int c)->int{ assert(h<=w); if(h==1) return 0; if(h==2){ int lf=c/2; int rg=(w-1-c)/2; return (lf%2==1 or rg%2==1); } if(h==3 and w==3) return (r!=1) or (c!=1); if(h==3 and w==5){ c=min(c,w-1-c); return (c==2) or (r+c)%2; } if(h%2==0) return 1; if(w%2==0) return 1; return (r+c)%2; }; if(0){ h=(24-cases)/5;w=(24-cases)%5;h++;w++; cout<<h<<' '<<w<<endl; if(h>w) swap(h,w); for(int i=0;i<h;i++){ for(int j=0;j<w;j++) cout<<dfs(get_bit(i,j),i,j); cout<<endl; } for(int i=0;i<h;i++) for(int j=0;j<w;j++) assert(dfs(get_bit(i,j),i,j)==calc(i,j)); continue; } int r,c; cin>>h>>w>>r>>c; r--;c--; if(h>w) swap(h,w),swap(r,c); cout<<(calc(r,c)?"Alice":"Bob")<<newl; } return 0; }