結果
| 問題 |
No.1149 色塗りゲーム
|
| コンテスト | |
| ユーザー |
IKyopro
|
| 提出日時 | 2020-08-07 22:24:58 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 160 ms / 2,000 ms |
| コード長 | 1,704 bytes |
| コンパイル時間 | 2,586 ms |
| コンパイル使用メモリ | 199,828 KB |
| 最終ジャッジ日時 | 2025-01-12 17:13:12 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;
int main(){
int N;
cin >> N;
vec<int> g(N+1);
g[1] = 1;
g[2] = 2;
for(int i=3;i<=N;i++){
set<int> s;
for(int j=1;j<=i;j++){
int a = j-1,b = i-j;
s.insert(g[a]^g[b]);
}
for(int j=1;j+1<=i;j++){
int a = j-1,b = i-j-1;
s.insert(g[a]^g[b]);
}
for(int a=0;a<=N;a++) if(!s.count(a)){
g[i] = a;
break;
}
}
auto print = [&](int k,int x){
cout << k << " " << x << endl;
};
vec<int> now(N);
auto calc_grundy = [&](){
int a = 0;
for(int l=0;l<N;l++) if(!now[l]){
int r = l+1;
while(r<N && !now[r]) r++;
a ^= g[r-l];
l = r-1;
}
return a;
};
while(true){
bool ok = false;
for(int i=0;i<N;i++) if(!now[i]){
now[i] = 1;
if(!calc_grundy()){
print(1,i+1);
ok = true;
break;
}else now[i] = 0;
}
if(!ok){
for(int i=0;i+1<N;i++) if(!now[i] && !now[i+1]){
now[i] = now[i+1] = 1;
if(!calc_grundy()){
print(2,i+1);
ok = true;
break;
}else now[i] = now[i+1] = 0;
}
}
int t;
cin >> t;
if(t<3) return 0;
int k,x;
cin >> k >> x;
x--;
now[x] = 1;
if(k==2) now[x+1] = 1;
}
}
IKyopro