提出 #44552145


ソースコード 拡げる

use proconio::{input, source::line::LineSource};
use std::{
    collections::HashSet,
    io::{stdin, BufReader, StdinLock},
    mem,
    process::exit,
};

fn transpose(temps: &Vec<Vec<i32>>) -> Vec<Vec<i32>> {
    let mut nxttemps = vec![vec![0; temps.len()]; temps.len()];
    for i in 0..temps.len() {
        for j in 0..temps.len() {
            nxttemps[j][i] = temps[i][j];
        }
    }
    return nxttemps;
}

fn linear_completion(_temps: &Vec<Vec<i32>>) -> Vec<Vec<i32>> {
    let mut temps = _temps.clone();
    let mut transposed = false;
    loop {
        let mut changed = false;
        for i in 0.._temps.len() {
            let mut v = Vec::<(i32, usize)>::new();
            for j in 0.._temps.len() {
                if temps[i][j] == -1 {
                    continue;
                }
                v.push((temps[i][j], j));
            }
            if v.len() > 1 && v.len() < _temps.len() {
                for x in 0..v.len() {
                    let diff = v[(x + 1) % v.len()].0 - v[x].0;
                    let nxtidx = v[(x + 1) % v.len()].1
                        + if v[(x + 1) % v.len()].1 > v[x].1 {
                            0
                        } else {
                            _temps.len()
                        };
                    let difflen = nxtidx - v[x].1;
                    for j in v[x].1 + 1..nxtidx {
                        temps[i][j % _temps.len()] =
                            v[x].0 + diff * (j - v[x].1) as i32 / difflen as i32;
                    }
                }
                changed = true;
            }
        }
        if !transposed && !changed {
            break;
        }
        let mut nxttemps = transpose(&temps);
        mem::swap(&mut temps, &mut nxttemps);
        transposed = !transposed;
    }
    return temps;
}

fn strategy1(
    source: &mut LineSource<BufReader<StdinLock<'_>>>,
    grid_size: usize,
    num_exit: usize,
    stdev: i32,
    exit_cells: Vec<(usize, usize)>,
) {
    println!("# strategy1");
    let mut exit_cells_ordered = exit_cells.clone();
    exit_cells_ordered.sort_by(|a, b| {
        ((a.0 as i32 - grid_size as i32 / 2).abs() + (a.1 as i32 - grid_size as i32 / 2).abs()).cmp(
            &((b.0 as i32 - grid_size as i32 / 2).abs()
                + (b.1 as i32 - grid_size as i32 / 2).abs()),
        )
    });

    let mut temps = vec![vec![-1; grid_size]; grid_size];
    let mut tem = stdev;
    // ふつうに埋めるパート
    for (i, j) in exit_cells_ordered.iter() {
        temps[*i][*j] = tem;
        tem += 2 * stdev;
    }
    // 線形補間
    let temps_yoko = linear_completion(&temps);
    let temps_tate = transpose(&linear_completion(&transpose(&temps)));
    for i in 0..grid_size {
        for j in 0..grid_size {
            temps[i][j] = (temps_yoko[i][j] + temps_tate[i][j]) / 2;
        }
    }

    // output temps
    for i in 0..grid_size {
        for j in 0..grid_size {
            print!("{} ", temps[i][j].min(1000).max(0));
        }
        println!("");
    }

    // measure
    let mut measure_res = vec![Vec::<i32>::new(); num_exit];
    for turn in 0..6 * num_exit {
        println!("{} {} {}", turn % num_exit, 0, 0);
        input! {
            from &mut *source,
            measure_result: i32
        };
        if measure_result == -1 {
            exit(0);
        }
        measure_res[turn % num_exit].push(measure_result);
    }

    // output
    println!("-1 -1 -1");
    for i in 0..num_exit {
        let mut ans = (0.0, 0);
        for x in 0..num_exit {
            let mut prob = 1.0;
            let temp = temps[exit_cells[x].0][exit_cells[x].1];
            for j in 0..measure_res[i].len() {
                let diff = (measure_res[i][j] - temp as i32) as f64;
                prob *= (-(diff * diff) / (2 * (stdev * stdev)) as f64).exp();
            }
            if prob > ans.0 {
                ans = (prob, x);
            }
        }
        eprintln!("{} {}", ans.0, ans.1);
        println!("{}", ans.1);
    }
}

fn strategy2(
    source: &mut LineSource<BufReader<StdinLock<'_>>>,
    grid_size: usize,
    num_exit: usize,
    stdev: i32,
    exit_cells: Vec<(usize, usize)>,
) {
    println!("# strategy2");
    let mut temps = vec![vec![0; grid_size]; grid_size];
    let center = (grid_size / 2, grid_size / 2);
    temps[center.0][center.1] = 1000;

    // output temps
    for i in 0..grid_size {
        for j in 0..grid_size {
            print!("{} ", temps[i][j].min(1000).max(0));
        }
        println!("");
    }

    // measure
    let mut ans = vec![0; num_exit];
    let mut remaining = HashSet::<usize>::new();
    for i in 0..num_exit {
        remaining.insert(i);
    }
    for i in 0..num_exit - 1 {
        for j in 0..num_exit {
            if !remaining.contains(&j) {
                continue;
            }
            let mut cnt = 0;
            for _ in 0..3 {
                println!(
                    "{} {} {}",
                    i,
                    center.0 as i32 - exit_cells[j].0 as i32,
                    center.1 as i32 - exit_cells[j].1 as i32
                );
                input! {
                    from &mut *source,
                    measure_result: i32
                };
                if measure_result == -1 {
                    exit(0);
                }
                if measure_result > 500 {
                    cnt += 1;
                }
            }
            if cnt >= 2 {
                ans[i] = j;
                remaining.remove(&j);
                break;
            }
        }
    }
    ans[num_exit - 1] = *remaining.iter().next().unwrap();

    // output results
    println!("-1 -1 -1");
    for i in 0..num_exit {
        println!("{}", ans[i]);
    }
}

fn main() {
    let stdin = stdin();
    let mut source = LineSource::new(BufReader::new(stdin.lock()));

    input! {
        from &mut source,
        grid_size: usize,
        num_exit: usize,
        stdev: i32,
        exit_cells: [(usize, usize); num_exit]
    };

    if 1000 >= (num_exit * 2 + 1) as i32 * stdev {
        strategy1(&mut source, grid_size, num_exit, stdev, exit_cells);
    } else {
        strategy2(&mut source, grid_size, num_exit, stdev, exit_cells);
    }
}

提出情報

提出日時
問題 A - Exploring Another Space
ユーザ a01sa01to
言語 Rust (1.42.0)
得点 207454243
コード長 6479 Byte
結果 AC
実行時間 79 ms
メモリ 4252 KiB

コンパイルエラー

warning: unused variable: `stdev`
   --> src/main.rs:138:5
    |
138 |     stdev: i32,
    |     ^^^^^ help: consider prefixing with an underscore: `_stdev`
    |
    = note: `#[warn(unused_variables)]` on by default

ジャッジ結果

セット名 test_ALL
得点 / 配点 207454243 / 50000000000
結果
AC × 50
セット名 テストケース
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt
ケース名 結果 実行時間 メモリ
test_0000.txt AC 79 ms 3788 KiB
test_0001.txt AC 29 ms 4044 KiB
test_0002.txt AC 58 ms 3836 KiB
test_0003.txt AC 60 ms 3800 KiB
test_0004.txt AC 23 ms 3980 KiB
test_0005.txt AC 25 ms 3988 KiB
test_0006.txt AC 25 ms 3980 KiB
test_0007.txt AC 59 ms 3840 KiB
test_0008.txt AC 27 ms 4188 KiB
test_0009.txt AC 45 ms 3812 KiB
test_0010.txt AC 29 ms 4196 KiB
test_0011.txt AC 46 ms 3716 KiB
test_0012.txt AC 20 ms 3716 KiB
test_0013.txt AC 39 ms 3716 KiB
test_0014.txt AC 54 ms 3932 KiB
test_0015.txt AC 27 ms 3944 KiB
test_0016.txt AC 27 ms 3928 KiB
test_0017.txt AC 17 ms 3940 KiB
test_0018.txt AC 28 ms 3948 KiB
test_0019.txt AC 41 ms 4040 KiB
test_0020.txt AC 29 ms 3932 KiB
test_0021.txt AC 26 ms 3928 KiB
test_0022.txt AC 27 ms 4048 KiB
test_0023.txt AC 44 ms 3768 KiB
test_0024.txt AC 41 ms 3708 KiB
test_0025.txt AC 54 ms 3704 KiB
test_0026.txt AC 47 ms 4052 KiB
test_0027.txt AC 29 ms 4032 KiB
test_0028.txt AC 35 ms 3984 KiB
test_0029.txt AC 38 ms 3948 KiB
test_0030.txt AC 25 ms 3992 KiB
test_0031.txt AC 34 ms 4076 KiB
test_0032.txt AC 33 ms 3940 KiB
test_0033.txt AC 34 ms 3944 KiB
test_0034.txt AC 21 ms 3936 KiB
test_0035.txt AC 33 ms 3816 KiB
test_0036.txt AC 38 ms 3732 KiB
test_0037.txt AC 59 ms 3988 KiB
test_0038.txt AC 31 ms 4188 KiB
test_0039.txt AC 36 ms 4036 KiB
test_0040.txt AC 55 ms 4252 KiB
test_0041.txt AC 42 ms 3940 KiB
test_0042.txt AC 37 ms 3736 KiB
test_0043.txt AC 29 ms 3980 KiB
test_0044.txt AC 61 ms 3728 KiB
test_0045.txt AC 38 ms 3768 KiB
test_0046.txt AC 28 ms 4080 KiB
test_0047.txt AC 62 ms 3732 KiB
test_0048.txt AC 35 ms 3780 KiB
test_0049.txt AC 36 ms 4040 KiB