use std::{cmp::Reverse, collections::BinaryHeap}; use itertools::Itertools; use proconio::{input, marker::Usize1}; fn main() { input! { player: String } if &player == "Alice" { alice(); } else { bob(); } } fn alice() { input! { n: usize } println!("{}", n - 2); input! { edges: [(Usize1, Usize1); n - 1], } let mut deg = vec![0; n]; let mut xor = vec![0; n]; for &(u, v) in &edges { deg[u] += 1; deg[v] += 1; xor[u] ^= v; xor[v] ^= u; } let mut heap: BinaryHeap<_> = (0..n) .filter_map(|v| (deg[v] == 1).then_some(Reverse(v))) .collect(); let mut a = vec![]; for _ in 0..n - 2 { let Reverse(v) = heap.pop().unwrap(); let u = xor[v]; deg[u] -= 1; xor[u] ^= v; if deg[u] == 1 { heap.push(Reverse(u)); } a.push(u); } println!("{}", a.iter().map(|&v| v + 1).join(" ")); } fn bob() { input! { n: usize } println!("{}", n - 2); input! { a: [Usize1; n - 2], } let mut cnt = vec![0; n]; for &a in &a { cnt[a] += 1; } let mut heap: BinaryHeap<_> = (0..n) .filter_map(|v| (cnt[v] == 0).then_some(Reverse(v))) .collect(); let mut edges = vec![]; for &v in &a { let Reverse(u) = heap.pop().unwrap(); cnt[v] -= 1; if cnt[v] == 0 { heap.push(Reverse(v)); } edges.push((u, v)); } let Reverse(u) = heap.pop().unwrap(); let Reverse(v) = heap.pop().unwrap(); edges.push((u, v)); for &(u, v) in &edges { println!("{} {}", u + 1, v + 1); } }