Submission #44613241
Source Code Expand
Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
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] = (4 * 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 = (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);
}
}
Submission Info
Submission Time |
|
Task |
A - Exploring Another Space |
User |
a01sa01to |
Language |
Rust (1.42.0) |
Score |
250945259 |
Code Size |
8017 Byte |
Status |
AC |
Exec Time |
83 ms |
Memory |
4164 KB |
Judge Result
Set Name |
test_ALL |
Score / Max Score |
250945259 / 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 |
68 ms |
3700 KB |
test_0001.txt |
AC |
56 ms |
4048 KB |
test_0002.txt |
AC |
62 ms |
4016 KB |
test_0003.txt |
AC |
64 ms |
3808 KB |
test_0004.txt |
AC |
71 ms |
3936 KB |
test_0005.txt |
AC |
59 ms |
3928 KB |
test_0006.txt |
AC |
43 ms |
3936 KB |
test_0007.txt |
AC |
67 ms |
3812 KB |
test_0008.txt |
AC |
66 ms |
3948 KB |
test_0009.txt |
AC |
45 ms |
3712 KB |
test_0010.txt |
AC |
50 ms |
4064 KB |
test_0011.txt |
AC |
41 ms |
4060 KB |
test_0012.txt |
AC |
18 ms |
3908 KB |
test_0013.txt |
AC |
39 ms |
3708 KB |
test_0014.txt |
AC |
73 ms |
3928 KB |
test_0015.txt |
AC |
52 ms |
4020 KB |
test_0016.txt |
AC |
67 ms |
4164 KB |
test_0017.txt |
AC |
17 ms |
4016 KB |
test_0018.txt |
AC |
58 ms |
3932 KB |
test_0019.txt |
AC |
50 ms |
4012 KB |
test_0020.txt |
AC |
65 ms |
3948 KB |
test_0021.txt |
AC |
56 ms |
4068 KB |
test_0022.txt |
AC |
68 ms |
4036 KB |
test_0023.txt |
AC |
44 ms |
4012 KB |
test_0024.txt |
AC |
44 ms |
3748 KB |
test_0025.txt |
AC |
71 ms |
3708 KB |
test_0026.txt |
AC |
66 ms |
3820 KB |
test_0027.txt |
AC |
57 ms |
4036 KB |
test_0028.txt |
AC |
83 ms |
4060 KB |
test_0029.txt |
AC |
51 ms |
3824 KB |
test_0030.txt |
AC |
50 ms |
3948 KB |
test_0031.txt |
AC |
44 ms |
4148 KB |
test_0032.txt |
AC |
39 ms |
3808 KB |
test_0033.txt |
AC |
52 ms |
3900 KB |
test_0034.txt |
AC |
45 ms |
4088 KB |
test_0035.txt |
AC |
35 ms |
3748 KB |
test_0036.txt |
AC |
39 ms |
3960 KB |
test_0037.txt |
AC |
66 ms |
3832 KB |
test_0038.txt |
AC |
56 ms |
4060 KB |
test_0039.txt |
AC |
47 ms |
4012 KB |
test_0040.txt |
AC |
83 ms |
3936 KB |
test_0041.txt |
AC |
60 ms |
4080 KB |
test_0042.txt |
AC |
38 ms |
3704 KB |
test_0043.txt |
AC |
53 ms |
3964 KB |
test_0044.txt |
AC |
62 ms |
3816 KB |
test_0045.txt |
AC |
34 ms |
4016 KB |
test_0046.txt |
AC |
57 ms |
4072 KB |
test_0047.txt |
AC |
65 ms |
3804 KB |
test_0048.txt |
AC |
39 ms |
3776 KB |
test_0049.txt |
AC |
41 ms |
3956 KB |