use proconio::input; //const LOCAL_EXECUTE:bool = true; const TARGET: i64 = 500_000_000_000_000_000; const OPERATION_LIMIT: usize = 50; fn operatioin(u: usize, v: usize, ab: &mut [(i64, i64)]) { let (a1, b1) = ab[u]; let (a2, b2) = ab[v]; let am = (a1 + a2) / 2; let bm = (b1 + b2) / 2; ab[u] = (am, bm); ab[v] = (am, bm); } fn calc_score(mut ab: Vec<(i64, i64)>, op: &[(usize, usize)]) -> i64 { for &(u, v) in op { operatioin(u, v, &mut ab); } let (a, b) = ab[0]; let v1 = a.abs_diff(TARGET); let v2 = b.abs_diff(TARGET); let m = v1.max(v2); let x = op.len() as i64; if m == 0 { return 2000050 - x; } let score = 2000000.0 - 100000.0 * f64::log10(m as f64 + 1.0); score as i64 } fn solver1(n: usize, mut ab: Vec<(i64, i64)>) -> Vec<(usize, usize)> { // いったん全部の平均に近づくようにやってみる // a_max - a_min と b_max - b_min の一番大きな組み合わせのカードで平均を取る let mut ans = vec![]; for _ in 0..OPERATION_LIMIT { let mut dist_max = -1; let mut i = 0; let mut j = 0; for ii in 0..(n - 1) { let (ai, bi) = ab[ii]; for jj in (ii + 1)..n { let (aj, bj) = ab[jj]; let dist = (ai - aj).abs().max((bi - bj).abs()); if dist > dist_max { dist_max = dist; i = ii; j = jj } } } ans.push((i, j)); operatioin(i, j, &mut ab); } ans } fn main() { input! { n:usize, ab:[(i64, i64); n] } // solve let ans = solver1(n, ab.clone()); eprintln!("{}", calc_score(ab.clone(), &ans)); println!("{}", ans.len()); for &(u,v) in &ans{ println!("{} {}", u, v); } }