提出 #44614695
ソースコード 拡げる
use num_integer::Roots;
use proconio::{input, source::line::LineSource};
use rand::seq::SliceRandom;
use std::{
collections::HashSet,
io::{stdin, BufReader, StdinLock},
mem,
};
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 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 {
let measure_result = measure(turn % num_exit, 0, 0, source);
if measure_result == -1 {
continue;
}
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] = (6 * 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()),
)
});
for i in 0..num_exit - 1 {
perm.shuffle(&mut rng);
for _j in 0..num_exit {
let j = perm[_j];
if !remaining.contains(&j) {
continue;
}
let mut cnt = 0;
let num_measure = if temps[center.0][center.1] < 1000 {
1
} else {
(stdev.sqrt() / 4).max(3)
};
for _ in 0..num_measure {
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,
source,
);
if measure_result == -1 {
continue;
}
cnt += measure_result;
}
if cnt >= temps[center.0][center.1] * num_measure / 2 {
ans[j] = ordered_exitidx[i];
remaining.remove(&j);
break;
}
}
}
ans[*remaining.iter().next().unwrap()] = ordered_exitidx[num_exit - 1];
// output results
println!("-1 -1 -1");
for i in 0..num_exit {
println!("{}", ans[i]);
}
}
fn _strategy3(
_source: &mut LineSource<BufReader<StdinLock<'_>>>,
grid_size: usize,
num_exit: usize,
_stdev: i32,
_exit_cells: Vec<(usize, usize)>,
) {
println!("# strategy3");
// output temps
for _ in 0..grid_size {
for __ in 0..grid_size {
print!("0 ");
}
println!("");
}
// output results
println!("-1 -1 -1");
for _ in 0..num_exit {
println!("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]
};
if 1000 >= (num_exit * 2 + 1) as i32 * stdev {
strategy1(&mut source, grid_size, num_exit, stdev, exit_cells);
// } else if stdev < 400 {
} else {
strategy2(&mut source, grid_size, num_exit, stdev, exit_cells);
// } else {
// strategy3(&mut source, grid_size, num_exit, stdev, exit_cells);
}
}
提出情報
ジャッジ結果
| セット名 |
test_ALL |
| 得点 / 配点 |
266204800 / 50000000000 |
| 結果 |
|
| セット名 |
テストケース |
| 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 |
45 ms |
3936 KiB |
| test_0001.txt |
AC |
60 ms |
3948 KiB |
| test_0002.txt |
AC |
31 ms |
4264 KiB |
| test_0003.txt |
AC |
26 ms |
3936 KiB |
| test_0004.txt |
AC |
78 ms |
4080 KiB |
| test_0005.txt |
AC |
66 ms |
3944 KiB |
| test_0006.txt |
AC |
44 ms |
3960 KiB |
| test_0007.txt |
AC |
64 ms |
3704 KiB |
| test_0008.txt |
AC |
58 ms |
3996 KiB |
| test_0009.txt |
AC |
23 ms |
3968 KiB |
| test_0010.txt |
AC |
50 ms |
3964 KiB |
| test_0011.txt |
AC |
43 ms |
3804 KiB |
| test_0012.txt |
AC |
17 ms |
3708 KiB |
| test_0013.txt |
AC |
21 ms |
4000 KiB |
| test_0014.txt |
AC |
73 ms |
3708 KiB |
| test_0015.txt |
AC |
43 ms |
4108 KiB |
| test_0016.txt |
AC |
69 ms |
3968 KiB |
| test_0017.txt |
AC |
17 ms |
4088 KiB |
| test_0018.txt |
AC |
56 ms |
3992 KiB |
| test_0019.txt |
AC |
46 ms |
3944 KiB |
| test_0020.txt |
AC |
57 ms |
4024 KiB |
| test_0021.txt |
AC |
55 ms |
4260 KiB |
| test_0022.txt |
AC |
61 ms |
3960 KiB |
| test_0023.txt |
AC |
47 ms |
3812 KiB |
| test_0024.txt |
AC |
21 ms |
3936 KiB |
| test_0025.txt |
AC |
29 ms |
4208 KiB |
| test_0026.txt |
AC |
63 ms |
3804 KiB |
| test_0027.txt |
AC |
55 ms |
3984 KiB |
| test_0028.txt |
AC |
81 ms |
4028 KiB |
| test_0029.txt |
AC |
42 ms |
3692 KiB |
| test_0030.txt |
AC |
45 ms |
4028 KiB |
| test_0031.txt |
AC |
43 ms |
3948 KiB |
| test_0032.txt |
AC |
22 ms |
3992 KiB |
| test_0033.txt |
AC |
47 ms |
3740 KiB |
| test_0034.txt |
AC |
43 ms |
4268 KiB |
| test_0035.txt |
AC |
33 ms |
3760 KiB |
| test_0036.txt |
AC |
23 ms |
3704 KiB |
| test_0037.txt |
AC |
64 ms |
3748 KiB |
| test_0038.txt |
AC |
53 ms |
4084 KiB |
| test_0039.txt |
AC |
41 ms |
3996 KiB |
| test_0040.txt |
AC |
84 ms |
4072 KiB |
| test_0041.txt |
AC |
54 ms |
4004 KiB |
| test_0042.txt |
AC |
26 ms |
3628 KiB |
| test_0043.txt |
AC |
51 ms |
4020 KiB |
| test_0044.txt |
AC |
28 ms |
4072 KiB |
| test_0045.txt |
AC |
24 ms |
3952 KiB |
| test_0046.txt |
AC |
61 ms |
3988 KiB |
| test_0047.txt |
AC |
27 ms |
4060 KiB |
| test_0048.txt |
AC |
24 ms |
4264 KiB |
| test_0049.txt |
AC |
45 ms |
3956 KiB |