Submission #44640484


Source Code Expand

use proconio::{input, source::line::LineSource};
use rand::seq::SliceRandom;
use std::{
    collections::HashSet,
    f64::consts::PI,
    io::{stdin, BufReader, StdinLock},
};

fn measure(i: usize, x: i32, y: i32, source: &mut LineSource<BufReader<StdinLock<'_>>>) -> i32 {
    static mut COUNT: usize = 0;
    unsafe { COUNT += 1 };
    if unsafe { COUNT } > 10000 {
        return -1;
    }
    println!("{} {} {}", i, x, y);
    input! {
        from &mut *source,
        measure_result: i32
    };
    return measure_result;
}

fn sqr<T>(x: T) -> T
where
    T: std::ops::Mul<Output = T> + Copy,
{
    x * x
}

fn erfc(x: f64) -> f64 {
    let mut res = 0.0;
    let times = 1000;
    for n in 0..times {
        let t = 2.0 / PI.sqrt() * x / (2.0 * n as f64 + 1.0);
        let mut u = 1.0;
        for k in 1..(n + 1) {
            u *= -(x * x) / k as f64;
        }
        res += t * u;
    }
    1.0 - res
}

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]
    };

    let mut temps = vec![vec![0; grid_size]; grid_size];
    let center = (grid_size / 2, grid_size / 2);
    temps[center.0][center.1] = (8 * stdev).min(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);
    }

    let mut rng = rand::thread_rng();
    let mut ordered_exitidx = (0..num_exit).collect::<Vec<usize>>();
    let mut perm = (0..num_exit).collect::<Vec<usize>>();
    ordered_exitidx.sort_by(|a, b| {
        ((exit_cells[*a].0 as i32 - center.0 as i32).abs()
            + (exit_cells[*a].1 as i32 - center.1 as i32).abs())
        .cmp(
            &((exit_cells[*b].0 as i32 - center.0 as i32).abs()
                + (exit_cells[*b].1 as i32 - center.1 as i32).abs()),
        )
    });

    let erfcval =
        1.0 - erfc(-temps[center.0][center.1] as f64 / (stdev as f64 * 2.0_f64.sqrt())) / 2.0;

    for i in 0..num_exit {
        perm.shuffle(&mut rng);
        for _j in 0..num_exit {
            let j = perm[_j];
            if !remaining.contains(&j) {
                continue;
            }
            let acceptance = 0.995;
            let mut percentage_one = 0.5;
            while (percentage_one - 0.5_f64).abs() < (acceptance - 0.5_f64).abs() {
                let measure_result = measure(
                    j,
                    center.0 as i32 - exit_cells[ordered_exitidx[i]].0 as i32,
                    center.1 as i32 - exit_cells[ordered_exitidx[i]].1 as i32,
                    &mut source,
                );
                if measure_result == -1 {
                    break;
                }
                let percentage_zero = 1.0 - percentage_one;
                let t = temps[center.0][center.1];
                let prob_one = if measure_result >= t {
                    0.5
                } else if measure_result == 0 {
                    erfcval
                } else {
                    (-sqr(measure_result - t) as f64 / (2 * sqr(stdev)) as f64).exp()
                        / (2.0 * PI * sqr(stdev) as f64).sqrt()
                };
                let prob_zero = if measure_result == 0 {
                    0.5
                } else if measure_result >= t {
                    erfcval
                } else {
                    (-sqr(measure_result) as f64 / (2 * sqr(stdev)) as f64).exp()
                        / (2.0 * PI * sqr(stdev) as f64).sqrt()
                };
                let sum = percentage_one * prob_one + percentage_zero * prob_zero;
                percentage_one = percentage_one * prob_one / sum;
                // eprintln!("{} {} {}", percentage_one, prob_one, measure_result);
            }
            if percentage_one > acceptance {
                ans[j] = ordered_exitidx[i];
                remaining.remove(&j);
                break;
            }
        }
    }

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

Submission Info

Submission Time
Task A - Exploring Another Space
User a01sa01to
Language Rust (1.42.0)
Score 508203383
Code Size 4527 Byte
Status AC
Exec Time 97 ms
Memory 4176 KiB

Judge Result

Set Name test_ALL
Score / Max Score 508203383 / 50000000000
Status
AC × 50
Set Name Test Cases
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
Case Name Status Exec Time Memory
test_0000.txt AC 45 ms 3924 KiB
test_0001.txt AC 77 ms 4080 KiB
test_0002.txt AC 36 ms 3744 KiB
test_0003.txt AC 34 ms 3772 KiB
test_0004.txt AC 89 ms 4040 KiB
test_0005.txt AC 97 ms 3948 KiB
test_0006.txt AC 83 ms 4040 KiB
test_0007.txt AC 40 ms 3772 KiB
test_0008.txt AC 92 ms 3996 KiB
test_0009.txt AC 32 ms 3800 KiB
test_0010.txt AC 41 ms 4036 KiB
test_0011.txt AC 31 ms 3988 KiB
test_0012.txt AC 30 ms 3692 KiB
test_0013.txt AC 24 ms 3784 KiB
test_0014.txt AC 38 ms 3976 KiB
test_0015.txt AC 93 ms 4052 KiB
test_0016.txt AC 91 ms 4036 KiB
test_0017.txt AC 23 ms 3820 KiB
test_0018.txt AC 90 ms 3948 KiB
test_0019.txt AC 35 ms 3696 KiB
test_0020.txt AC 57 ms 3996 KiB
test_0021.txt AC 91 ms 3932 KiB
test_0022.txt AC 93 ms 4044 KiB
test_0023.txt AC 36 ms 3688 KiB
test_0024.txt AC 36 ms 3680 KiB
test_0025.txt AC 30 ms 3680 KiB
test_0026.txt AC 40 ms 3764 KiB
test_0027.txt AC 76 ms 3732 KiB
test_0028.txt AC 87 ms 4176 KiB
test_0029.txt AC 32 ms 3928 KiB
test_0030.txt AC 86 ms 4004 KiB
test_0031.txt AC 33 ms 3928 KiB
test_0032.txt AC 24 ms 3796 KiB
test_0033.txt AC 27 ms 3784 KiB
test_0034.txt AC 82 ms 4096 KiB
test_0035.txt AC 23 ms 3708 KiB
test_0036.txt AC 25 ms 3924 KiB
test_0037.txt AC 35 ms 3836 KiB
test_0038.txt AC 87 ms 4068 KiB
test_0039.txt AC 37 ms 3832 KiB
test_0040.txt AC 49 ms 4080 KiB
test_0041.txt AC 45 ms 4048 KiB
test_0042.txt AC 27 ms 3816 KiB
test_0043.txt AC 44 ms 3940 KiB
test_0044.txt AC 34 ms 3824 KiB
test_0045.txt AC 23 ms 3772 KiB
test_0046.txt AC 94 ms 3936 KiB
test_0047.txt AC 36 ms 3984 KiB
test_0048.txt AC 29 ms 3764 KiB
test_0049.txt AC 34 ms 3932 KiB