結果
問題 |
No.3258 Xor Division Game
|
ユーザー |
|
提出日時 | 2025-10-17 16:45:20 |
言語 | Rust (1.83.0 + proconio) |
結果 |
RE
|
実行時間 | - |
コード長 | 3,503 bytes |
コンパイル時間 | 11,528 ms |
コンパイル使用メモリ | 400,272 KB |
実行使用メモリ | 9,232 KB |
最終ジャッジ日時 | 2025-10-17 16:45:42 |
合計ジャッジ時間 | 16,832 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 32 WA * 6 RE * 29 |
コンパイルメッセージ
warning: unused variable: `n` --> src/main.rs:104:9 | 104 | let n = a.len(); | ^ help: if this is intentional, prefix it with an underscore: `_n` | = note: `#[warn(unused_variables)]` on by default warning: variable `seen` is assigned to, but never used --> src/main.rs:105:13 | 105 | let mut seen = s.l; | ^^^^ | = note: consider using `_seen` instead warning: value assigned to `seen` is never read --> src/main.rs:111:9 | 111 | seen = idx + 1; | ^^^^ | = help: maybe it is overwritten before being read? = note: `#[warn(unused_assignments)]` on by default warning: function `facil` is never used --> src/main.rs:17:4 | 17 | fn facil(a: &[u32], l: usize, r: usize) -> Stat { | ^^^^^ | = note: `#[warn(dead_code)]` on by default
ソースコード
use std::collections::*; fn getline() -> String { let mut ret = String::new(); std::io::stdin().read_line(&mut ret).unwrap(); ret } #[derive(Debug)] struct Stat { l: usize, r: usize, unique: BTreeSet<usize>, // index freq: HashMap<u32, i32>, } fn facil(a: &[u32], l: usize, r: usize) -> Stat { let b = &a[l..r]; let mut freq = HashMap::new(); for &f in b { *freq.entry(f).or_insert(0) += 1; } let stat = Stat { l, r, unique: { let mut x = BTreeSet::new(); for i in l..r { if freq[&a[i]] == 1 { x.insert(i); } } x }, freq, }; stat } fn split(a: &[u32], mut s: Stat, idx: usize) -> (Stat, Stat) { let val = a[idx]; assert_eq!(s.freq[&val], 1); s.freq.remove(&val); s.unique.remove(&idx); let mut new = Stat { l: s.l, r: s.r, unique: BTreeSet::new(), freq: HashMap::new(), }; if 2 * idx >= s.l + s.r { for i in idx + 1..s.r { let f = a[i]; let c = s.freq.get(&f).cloned().unwrap_or(0); if c > 0 { *s.freq.get_mut(&f).unwrap() -= 1; if c == 1 { s.freq.remove(&f); s.unique.remove(&i); } if c == 2 { s.unique.insert(i); } } let c = new.freq.get(&f).cloned().unwrap_or(0); *new.freq.entry(f).or_insert(0) += 1; if c == 0 { new.unique.insert(i); } else if c == 1 { new.unique.remove(&i); } } new.l = idx + 1; s.r = idx; return (s, new); } for i in s.l..idx { let f = a[i]; let c = s.freq.get(&f).cloned().unwrap_or(0); if c > 0 { *s.freq.get_mut(&f).unwrap() -= 1; if c == 1 { s.freq.remove(&f); s.unique.remove(&i); } if c == 2 { s.unique.insert(i); } } let c = new.freq.get(&f).cloned().unwrap_or(0); *new.freq.entry(f).or_insert(0) += 1; if c == 0 { new.unique.insert(i); } else if c == 1 { new.unique.remove(&i); } } new.r = idx; s.l = idx + 1; (new, s) } fn rec(a: &[u32], mut s: Stat) -> i32 { let n = a.len(); let mut seen = s.l; let mut ans = 0; while let Some(&idx) = s.unique.first() { let (t, tmp) = split(a, s, idx); ans += rec(a, t) + 1; s = tmp; seen = idx + 1; } // eprintln!("stat = {s:?}, ans = {ans}"); ans } // https://yukicoder.me/problems/no/3258 (3.5) fn main() { getline(); let f = getline().trim().split_whitespace() .map(|x| x.parse::<u32>().unwrap()) .collect::<Vec<_>>(); let n = f.len(); let mut freq = HashMap::new(); for &f in &f { *freq.entry(f).or_insert(0) += 1; } let stat = Stat { l: 0, r: n, unique: { let mut x = BTreeSet::new(); for i in 0..n { if freq[&f[i]] == 1 { x.insert(i); } } x }, freq, }; println!("{}", if rec(&f, stat) % 2 == 1 { "Alice" } else { "Bob" }); }