結果
| 問題 |
No.715 集合と二人ゲーム
|
| コンテスト | |
| ユーザー |
fukafukatani
|
| 提出日時 | 2019-02-09 11:23:23 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,586 bytes |
| コンパイル時間 | 15,476 ms |
| コンパイル使用メモリ | 381,716 KB |
| 実行使用メモリ | 12,188 KB |
| 最終ジャッジ日時 | 2024-07-01 18:35:56 |
| 合計ジャッジ時間 | 25,091 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 30 TLE * 1 -- * 29 |
ソースコード
#[allow(unused_imports)]
use std::cmp::*;
#[allow(unused_imports)]
use std::collections::*;
fn read<T: std::str::FromStr>() -> T {
let mut s = String::new();
std::io::stdin().read_line(&mut s).ok();
s.trim().parse().ok().unwrap()
}
fn read_vec<T: std::str::FromStr>() -> Vec<T> {
read::<String>()
.split_whitespace()
.map(|e| e.parse().ok().unwrap())
.collect()
}
fn grundy(m: usize, mem: &mut Vec<i32>) -> i32 {
if mem[m] != -1 {
return mem[m];
}
let mut s = HashSet::new();
s.insert(mem[m - 1]);
if m > 1 {
s.insert(mem[m - 2]);
}
if m > 2 {
for i in 0..m - 3 + 1 {
s.insert(mem[i] ^ mem[m - i - 3]);
}
}
let mut res = 0;
while s.contains(&res) {
res += 1;
}
mem[m] = res;
res - 1
}
fn main() {
let n: usize = read();
let mut a: Vec<u64> = read_vec();
a.sort();
let mut mountains = Vec::new();
mountains.push(1);
for i in 1..n {
if a[i] == a[i - 1] + 1 {
let last_elem = mountains.len() - 1;
mountains[last_elem] += 1;
} else {
mountains.push(1);
}
}
let max_elem = *mountains.iter().max().unwrap();
let mut mem = vec![-1; max_elem + 1];
mem[0] = 0;
for m in 0..max_elem + 1 {
grundy(m, &mut mem);
}
println!("{:?}", mountains);
println!("{:?}", mem);
let result = mountains.iter().fold(0, |s, &x| s ^ mem[x]);
if result == 0 {
println!("Second");
} else {
println!("First");
}
}
fukafukatani