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 |
|
| 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 |