Submission #61871153
Source Code Expand
use std::collections::VecDeque;
use itertools::Itertools;
use proconio::input;
use rand::{thread_rng, Rng};
use utils::get_time;
static TIME_LIMIT: f64 = 1.996;
static INF: i32 = 1 << 30;
#[allow(dead_code)]
pub mod utils {
#[inline]
pub fn get_time() -> f64 { // sec
static mut STIME: f64 = -1.0;
let t = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap();
let ms = t.as_secs() as f64 + t.subsec_nanos() as f64 * 1e-9;
unsafe {
if STIME < 0.0 {
STIME = ms;
}
ms - STIME
}
}
}
fn calc_score(g: &Vec<Vec<usize>> ,v: &Vec<i32>, a: &Vec<u32>, h: u32) -> Result<u32, ()> {
// TODO: 差分計算して高速化する
let mut score = 0;
for (i, _) in v.iter().enumerate().filter(|(_, &xi)| xi == -1) {
let mut que = VecDeque::new();
que.push_back((i, 0));
while let Some((u, d)) = que.pop_front() {
score += a[u] * (d+1);
for &v in &g[u] {
if d + 1 > h {
// invalid
return Err(());
}
que.push_back((v, d + 1));
}
}
}
Ok(1+score)
}
fn calc_score2(g: &mut Vec<Vec<usize>>, v: &mut Vec<i32>, a: &Vec<u32>, h: u32, depth: &Vec<u32>, i: usize, k: usize) -> Result<i32, ()> {
if depth[k]+1 > h {
return Err(());
}
// iの親をkに変更した場合のスコアの変動を計算
let mut prev_score = 0;
let mut next_score = 0;
let mut que = VecDeque::new();
que.push_back((i, depth[i]));
while let Some((u, d)) = que.pop_front() {
prev_score += a[u] * (d+1);
for &v in &g[u] {
que.push_back((v, d + 1));
}
}
// 親の更新
let prev = v[i];
v[i] = k as i32;
// gの更新
if prev != -1 {
g[prev as usize].retain(|&x| x != i);
}
g[k].push(i);
// 更新後のスコア計算
que.clear();
que.push_back((i, depth[k]+1));
while let Some((u, d)) = que.pop_front() {
next_score += a[u] * (d+1);
for &ni in &g[u] {
if d + 1 > h {
// invalid
if prev != -1 {
g[prev as usize].push(i);
}
g[k].retain(|&x| x != i);
v[i] = prev;
return Err(());
}
que.push_back((ni, d + 1));
}
}
// 復元
if prev != -1 {
g[prev as usize].push(i);
}
g[k].retain(|&x| x != i);
v[i] = prev;
Ok(next_score as i32 - prev_score as i32)
}
fn main() {
get_time();
input! {
n: usize,
m: usize,
h: u32,
a: [u32; n],
edges: [(usize, usize); m],
}
let graph = edges.iter().fold(vec![vec![]; n], |mut g, &(u, v)| {
g[u].push(v);
g[v].push(u);
g
});
let mut seen = vec![INF; n];
for (i, _) in a.iter().enumerate().sorted_unstable_by_key(|&(_, &x)| x) {
if seen[i] != INF {
continue;
}
seen[i] = -1;
// bfs
// ただし、深さdに対して、max(d/2, 1)個の辺のみを探索する
let mut q = VecDeque::new();
q.push_back((i, 0));
while let Some((u, d)) = q.pop_front() {
let mut cnt = 0;
for &v in &graph[u] {
if cnt >= (d / 2).max(1) {
break;
}
if seen[v] != INF {
continue;
}
seen[v] = u as i32;
if d + 1 >= h {
continue;
}
cnt += 1;
q.push_back((v, d + 1));
}
}
}
let mut g = vec![vec![]; n];
for (i, &x) in seen.iter().enumerate() {
if x == -1 {
continue;
}
g[x as usize].push(i);
}
let mut depth = vec![0; n];
for i in 0..n {
if seen[i] != -1 {
continue;
}
let mut que = VecDeque::new();
que.push_back((i, 0));
while let Some((u, d)) = que.pop_front() {
depth[u] = d;
for &v in &g[u] {
que.push_back((v, d + 1));
}
}
}
let mut current_score = calc_score(&g,&seen, &a, h).unwrap();
// eprintln!("init score: {}", current_score);
let mut rng = thread_rng();
let start_temp = 5e2;
let end_temp = 1e-3;
while get_time() < TIME_LIMIT {
let i = rng.gen_range(0..n);
let j = rng.gen_range(0..graph[i].len());
let k = graph[i][j];
// iの親がk, あるいはkの子がiの場合はスキップ
if seen[i] == k as i32 || seen[k] == i as i32 {
continue;
}
if let Ok(score_diff) = calc_score2(&mut g, &mut seen, &a, h, &depth, i, k) {
let temp = start_temp + (end_temp - start_temp) * get_time() / TIME_LIMIT;
let prob = (score_diff as f64 / temp).exp();
if score_diff > 0 || rng.gen::<f64>() < prob {
// accept
current_score = (current_score as i32 + score_diff) as u32;
// グラフと深さの更新
let prev = seen[i];
seen[i] = k as i32;
let mut que = VecDeque::new();
que.push_back((i, depth[k]+1));
while let Some((u, d)) = que.pop_front() {
depth[u] = d;
for &v in &g[u] {
que.push_back((v, d + 1));
}
}
g[k].push(i);
if prev != -1 {
g[prev as usize].retain(|&x| x != i);
}
}
}
}
println!("{}", seen.iter().join(" "));
}
Submission Info
| Submission Time | |
|---|---|
| Task | A - Christmas Tree Cutting |
| User | ardRiriy |
| Language | Rust (rustc 1.70.0) |
| Score | 75269940 |
| Code Size | 6148 Byte |
| Status | AC |
| Exec Time | 1997 ms |
| Memory | 2968 KiB |
Judge Result
| Set Name | test_ALL | ||
|---|---|---|---|
| Score / Max Score | 75269940 / 300000000000 | ||
| 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, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| test_0000.txt | AC | 1997 ms | 2936 KiB |
| test_0001.txt | AC | 1997 ms | 2920 KiB |
| test_0002.txt | AC | 1997 ms | 2824 KiB |
| test_0003.txt | AC | 1997 ms | 2912 KiB |
| test_0004.txt | AC | 1996 ms | 2716 KiB |
| test_0005.txt | AC | 1997 ms | 2896 KiB |
| test_0006.txt | AC | 1996 ms | 2924 KiB |
| test_0007.txt | AC | 1997 ms | 2916 KiB |
| test_0008.txt | AC | 1997 ms | 2900 KiB |
| test_0009.txt | AC | 1997 ms | 2892 KiB |
| test_0010.txt | AC | 1997 ms | 2836 KiB |
| test_0011.txt | AC | 1997 ms | 2836 KiB |
| test_0012.txt | AC | 1996 ms | 2716 KiB |
| test_0013.txt | AC | 1997 ms | 2804 KiB |
| test_0014.txt | AC | 1997 ms | 2832 KiB |
| test_0015.txt | AC | 1997 ms | 2896 KiB |
| test_0016.txt | AC | 1996 ms | 2900 KiB |
| test_0017.txt | AC | 1997 ms | 2912 KiB |
| test_0018.txt | AC | 1997 ms | 2772 KiB |
| test_0019.txt | AC | 1997 ms | 2912 KiB |
| test_0020.txt | AC | 1997 ms | 2836 KiB |
| test_0021.txt | AC | 1997 ms | 2780 KiB |
| test_0022.txt | AC | 1997 ms | 2764 KiB |
| test_0023.txt | AC | 1997 ms | 2916 KiB |
| test_0024.txt | AC | 1997 ms | 2844 KiB |
| test_0025.txt | AC | 1997 ms | 2904 KiB |
| test_0026.txt | AC | 1997 ms | 2904 KiB |
| test_0027.txt | AC | 1997 ms | 2904 KiB |
| test_0028.txt | AC | 1997 ms | 2836 KiB |
| test_0029.txt | AC | 1997 ms | 2864 KiB |
| test_0030.txt | AC | 1997 ms | 2960 KiB |
| test_0031.txt | AC | 1997 ms | 2904 KiB |
| test_0032.txt | AC | 1997 ms | 2932 KiB |
| test_0033.txt | AC | 1997 ms | 2916 KiB |
| test_0034.txt | AC | 1997 ms | 2872 KiB |
| test_0035.txt | AC | 1996 ms | 2960 KiB |
| test_0036.txt | AC | 1997 ms | 2952 KiB |
| test_0037.txt | AC | 1997 ms | 2844 KiB |
| test_0038.txt | AC | 1997 ms | 2964 KiB |
| test_0039.txt | AC | 1996 ms | 2956 KiB |
| test_0040.txt | AC | 1997 ms | 2916 KiB |
| test_0041.txt | AC | 1997 ms | 2876 KiB |
| test_0042.txt | AC | 1997 ms | 2772 KiB |
| test_0043.txt | AC | 1996 ms | 2900 KiB |
| test_0044.txt | AC | 1996 ms | 2828 KiB |
| test_0045.txt | AC | 1997 ms | 2968 KiB |
| test_0046.txt | AC | 1997 ms | 2844 KiB |
| test_0047.txt | AC | 1997 ms | 2908 KiB |
| test_0048.txt | AC | 1996 ms | 2920 KiB |
| test_0049.txt | AC | 1997 ms | 2900 KiB |
| test_0050.txt | AC | 1997 ms | 2964 KiB |
| test_0051.txt | AC | 1996 ms | 2836 KiB |
| test_0052.txt | AC | 1996 ms | 2936 KiB |
| test_0053.txt | AC | 1996 ms | 2844 KiB |
| test_0054.txt | AC | 1996 ms | 2904 KiB |
| test_0055.txt | AC | 1997 ms | 2912 KiB |
| test_0056.txt | AC | 1997 ms | 2900 KiB |
| test_0057.txt | AC | 1996 ms | 2960 KiB |
| test_0058.txt | AC | 1996 ms | 2872 KiB |
| test_0059.txt | AC | 1997 ms | 2848 KiB |
| test_0060.txt | AC | 1997 ms | 2808 KiB |
| test_0061.txt | AC | 1996 ms | 2908 KiB |
| test_0062.txt | AC | 1997 ms | 2792 KiB |
| test_0063.txt | AC | 1997 ms | 2900 KiB |
| test_0064.txt | AC | 1997 ms | 2860 KiB |
| test_0065.txt | AC | 1997 ms | 2960 KiB |
| test_0066.txt | AC | 1997 ms | 2892 KiB |
| test_0067.txt | AC | 1997 ms | 2960 KiB |
| test_0068.txt | AC | 1997 ms | 2900 KiB |
| test_0069.txt | AC | 1997 ms | 2832 KiB |
| test_0070.txt | AC | 1997 ms | 2964 KiB |
| test_0071.txt | AC | 1996 ms | 2900 KiB |
| test_0072.txt | AC | 1997 ms | 2900 KiB |
| test_0073.txt | AC | 1997 ms | 2812 KiB |
| test_0074.txt | AC | 1997 ms | 2960 KiB |
| test_0075.txt | AC | 1997 ms | 2912 KiB |
| test_0076.txt | AC | 1997 ms | 2892 KiB |
| test_0077.txt | AC | 1997 ms | 2856 KiB |
| test_0078.txt | AC | 1997 ms | 2804 KiB |
| test_0079.txt | AC | 1997 ms | 2772 KiB |
| test_0080.txt | AC | 1997 ms | 2840 KiB |
| test_0081.txt | AC | 1996 ms | 2960 KiB |
| test_0082.txt | AC | 1997 ms | 2908 KiB |
| test_0083.txt | AC | 1996 ms | 2868 KiB |
| test_0084.txt | AC | 1997 ms | 2832 KiB |
| test_0085.txt | AC | 1997 ms | 2928 KiB |
| test_0086.txt | AC | 1997 ms | 2772 KiB |
| test_0087.txt | AC | 1996 ms | 2912 KiB |
| test_0088.txt | AC | 1997 ms | 2868 KiB |
| test_0089.txt | AC | 1997 ms | 2904 KiB |
| test_0090.txt | AC | 1997 ms | 2844 KiB |
| test_0091.txt | AC | 1997 ms | 2872 KiB |
| test_0092.txt | AC | 1997 ms | 2832 KiB |
| test_0093.txt | AC | 1997 ms | 2844 KiB |
| test_0094.txt | AC | 1997 ms | 2904 KiB |
| test_0095.txt | AC | 1997 ms | 2868 KiB |
| test_0096.txt | AC | 1996 ms | 2804 KiB |
| test_0097.txt | AC | 1996 ms | 2960 KiB |
| test_0098.txt | AC | 1996 ms | 2804 KiB |
| test_0099.txt | AC | 1996 ms | 2868 KiB |
| test_0100.txt | AC | 1997 ms | 2960 KiB |
| test_0101.txt | AC | 1997 ms | 2900 KiB |
| test_0102.txt | AC | 1997 ms | 2852 KiB |
| test_0103.txt | AC | 1997 ms | 2836 KiB |
| test_0104.txt | AC | 1997 ms | 2904 KiB |
| test_0105.txt | AC | 1997 ms | 2928 KiB |
| test_0106.txt | AC | 1997 ms | 2912 KiB |
| test_0107.txt | AC | 1997 ms | 2904 KiB |
| test_0108.txt | AC | 1997 ms | 2804 KiB |
| test_0109.txt | AC | 1997 ms | 2848 KiB |
| test_0110.txt | AC | 1997 ms | 2796 KiB |
| test_0111.txt | AC | 1997 ms | 2960 KiB |
| test_0112.txt | AC | 1996 ms | 2904 KiB |
| test_0113.txt | AC | 1997 ms | 2912 KiB |
| test_0114.txt | AC | 1997 ms | 2936 KiB |
| test_0115.txt | AC | 1996 ms | 2840 KiB |
| test_0116.txt | AC | 1997 ms | 2852 KiB |
| test_0117.txt | AC | 1996 ms | 2832 KiB |
| test_0118.txt | AC | 1997 ms | 2932 KiB |
| test_0119.txt | AC | 1997 ms | 2900 KiB |
| test_0120.txt | AC | 1996 ms | 2964 KiB |
| test_0121.txt | AC | 1997 ms | 2844 KiB |
| test_0122.txt | AC | 1997 ms | 2848 KiB |
| test_0123.txt | AC | 1997 ms | 2960 KiB |
| test_0124.txt | AC | 1997 ms | 2864 KiB |
| test_0125.txt | AC | 1996 ms | 2912 KiB |
| test_0126.txt | AC | 1996 ms | 2804 KiB |
| test_0127.txt | AC | 1997 ms | 2780 KiB |
| test_0128.txt | AC | 1997 ms | 2912 KiB |
| test_0129.txt | AC | 1996 ms | 2776 KiB |
| test_0130.txt | AC | 1997 ms | 2960 KiB |
| test_0131.txt | AC | 1997 ms | 2872 KiB |
| test_0132.txt | AC | 1997 ms | 2780 KiB |
| test_0133.txt | AC | 1997 ms | 2864 KiB |
| test_0134.txt | AC | 1997 ms | 2868 KiB |
| test_0135.txt | AC | 1997 ms | 2804 KiB |
| test_0136.txt | AC | 1997 ms | 2904 KiB |
| test_0137.txt | AC | 1997 ms | 2868 KiB |
| test_0138.txt | AC | 1997 ms | 2836 KiB |
| test_0139.txt | AC | 1997 ms | 2872 KiB |
| test_0140.txt | AC | 1997 ms | 2896 KiB |
| test_0141.txt | AC | 1996 ms | 2712 KiB |
| test_0142.txt | AC | 1996 ms | 2940 KiB |
| test_0143.txt | AC | 1997 ms | 2868 KiB |
| test_0144.txt | AC | 1997 ms | 2960 KiB |
| test_0145.txt | AC | 1996 ms | 2900 KiB |
| test_0146.txt | AC | 1997 ms | 2960 KiB |
| test_0147.txt | AC | 1997 ms | 2960 KiB |
| test_0148.txt | AC | 1997 ms | 2784 KiB |
| test_0149.txt | AC | 1996 ms | 2868 KiB |