Submission #44698241
Source Code Expand
use libm::erfc;
use proconio::{input, source::line::LineSource};
use rand::seq::SliceRandom;
use std::{
collections::HashSet,
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;
}
// P(X <= x)
fn prob(x: f64, stdev: i32) -> f64 {
erfc(-x / (stdev as f64 * 2.0_f64.sqrt())) / 2.0
}
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 ans_undecided = 10000000;
let mut ans = vec![ans_undecided; 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()),
)
});
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 one_acceptance = 0.9999;
let zero_acceptance = 0.85;
let mut percentage_one = 0.35;
while percentage_one < one_acceptance && (1.0 - percentage_one) < zero_acceptance {
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 {
prob(0.5, stdev)
} else if measure_result == 0 {
prob(-t as f64 + 0.5, stdev)
} else {
prob((measure_result - t) as f64 + 0.5, stdev)
- prob((measure_result - t) as f64 - 0.5, stdev)
};
let prob_zero = if measure_result == 0 {
prob(0.5, stdev)
} else if measure_result >= t {
prob(-t as f64 + 0.5, stdev)
} else {
prob(-measure_result as f64 + 0.5, stdev)
- prob(-measure_result as f64 - 0.5, stdev)
};
let sum = percentage_one * prob_one + percentage_zero * prob_zero;
percentage_one = percentage_one * prob_one / sum;
// eprintln!(
// "P1:{}, prob1:{}, prob0:{} res:{}",
// percentage_one, prob_one, prob_zero, measure_result
// );
}
if percentage_one > one_acceptance {
ans[j] = ordered_exitidx[i];
remaining.remove(&j);
break;
}
}
}
if remaining.len() > 0 {
let mut remaining = HashSet::<usize>::new();
for i in 0..num_exit {
remaining.insert(i);
}
for i in 0..num_exit {
if ans[i] != ans_undecided {
remaining.remove(&i);
}
}
eprintln!("remaining: {:?}", remaining);
let rem = remaining.iter().next().unwrap().clone();
for i in 0..num_exit {
if ans[i] == ans_undecided {
ans[i] = rem;
}
}
}
// 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 | 519959713 |
| Code Size | 4916 Byte |
| Status | AC |
| Exec Time | 97 ms |
| Memory | 4256 KiB |
Judge Result
| Set Name | test_ALL | ||
|---|---|---|---|
| Score / Max Score | 519959713 / 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 | 42 ms | 3764 KiB |
| test_0001.txt | AC | 44 ms | 3948 KiB |
| test_0002.txt | AC | 37 ms | 3772 KiB |
| test_0003.txt | AC | 35 ms | 3780 KiB |
| test_0004.txt | AC | 97 ms | 4068 KiB |
| test_0005.txt | AC | 74 ms | 3964 KiB |
| test_0006.txt | AC | 48 ms | 4192 KiB |
| test_0007.txt | AC | 32 ms | 3780 KiB |
| test_0008.txt | AC | 80 ms | 3956 KiB |
| test_0009.txt | AC | 25 ms | 3780 KiB |
| test_0010.txt | AC | 31 ms | 4016 KiB |
| test_0011.txt | AC | 23 ms | 3892 KiB |
| test_0012.txt | AC | 35 ms | 3796 KiB |
| test_0013.txt | AC | 29 ms | 3712 KiB |
| test_0014.txt | AC | 39 ms | 4012 KiB |
| test_0015.txt | AC | 55 ms | 3952 KiB |
| test_0016.txt | AC | 87 ms | 4080 KiB |
| test_0017.txt | AC | 20 ms | 3864 KiB |
| test_0018.txt | AC | 69 ms | 4072 KiB |
| test_0019.txt | AC | 29 ms | 3944 KiB |
| test_0020.txt | AC | 41 ms | 3956 KiB |
| test_0021.txt | AC | 50 ms | 4052 KiB |
| test_0022.txt | AC | 52 ms | 4044 KiB |
| test_0023.txt | AC | 28 ms | 3948 KiB |
| test_0024.txt | AC | 23 ms | 4012 KiB |
| test_0025.txt | AC | 35 ms | 3716 KiB |
| test_0026.txt | AC | 32 ms | 4088 KiB |
| test_0027.txt | AC | 48 ms | 4012 KiB |
| test_0028.txt | AC | 81 ms | 3952 KiB |
| test_0029.txt | AC | 28 ms | 4256 KiB |
| test_0030.txt | AC | 72 ms | 4024 KiB |
| test_0031.txt | AC | 28 ms | 3888 KiB |
| test_0032.txt | AC | 20 ms | 3716 KiB |
| test_0033.txt | AC | 25 ms | 3720 KiB |
| test_0034.txt | AC | 47 ms | 3948 KiB |
| test_0035.txt | AC | 33 ms | 4004 KiB |
| test_0036.txt | AC | 23 ms | 3876 KiB |
| test_0037.txt | AC | 34 ms | 3960 KiB |
| test_0038.txt | AC | 68 ms | 3948 KiB |
| test_0039.txt | AC | 34 ms | 4068 KiB |
| test_0040.txt | AC | 44 ms | 4196 KiB |
| test_0041.txt | AC | 35 ms | 4072 KiB |
| test_0042.txt | AC | 26 ms | 3956 KiB |
| test_0043.txt | AC | 35 ms | 4068 KiB |
| test_0044.txt | AC | 38 ms | 3768 KiB |
| test_0045.txt | AC | 28 ms | 3852 KiB |
| test_0046.txt | AC | 63 ms | 4000 KiB |
| test_0047.txt | AC | 32 ms | 3716 KiB |
| test_0048.txt | AC | 20 ms | 3724 KiB |
| test_0049.txt | AC | 31 ms | 3796 KiB |