Submission #61912817
Source Code Expand
#![allow(non_snake_case, dead_code)]
const N: usize = 1000;
const H: usize = 10;
fn main() {
get_time();
/*
let args: Vec<String> = std::env::args().collect();
let T0 = args[1].parse::<f64>().unwrap();
let T1 = args[2].parse::<f64>().unwrap();
*/
let T0 = 150.20f64;
let T1 = 1.6f64;
let input = Input::from_stdin();
/*
let mut V = [!0i32; N];
let mut idx = (0..N).collect_vec();
idx.sort_by(|i, j| input.A[*i].cmp(&input.A[*j]));
let mut now_score = 0;
for i in idx {
let mut max = 0;
for &j in input.nexts(i) {
if V[j] != !0 && V[j] <= 2 {
max = max.max(V[j] + 1);
}
}
V[i] = max;
now_score += (V[i] + 1) * input.A[i];
}
*/
let mut V = [0; N];
let mut now_score = input.A.iter().sum::<i32>();
let mut max_score = now_score;
let mut max_answer = V.clone();
let mut neibor_levels = vec![0; N * 12];
for i in 0..N {
for &j in input.nexts(i) {
neibor_levels[i * 12 + V[j] as usize] += 1;
}
}
{
let mut mt = Mt::new(768);
// let T0 = 200.0f64;
// let T1 = 20.0f64;
let mut T = T0;
let mut iter = 0;
let TL = 1.998;
'LOOP: loop {
let t = get_time();
if t >= TL {
break;
}
iter += 1;
if (iter & ((1 << 20) - 1)) == 0 {
eprintln!("{} {} {}", iter, T, now_score);
let p = t / TL;
// T = T0.powf(1.0 - p) * T1.powf(p);
T = T0 * (1.0 - p) + T1 * p;
}
let query = mt.gen_range(0.0..1.0);
if query <= 0.50 {
let i = mt.gen_range(0..N);
let L = input.S[i + 1] - input.S[i];
let chi = mt.gen_range(0..=L);
if chi < L && V[input.G[input.S[i] + chi]] == 10 {
continue 'LOOP;
}
let before_v = V[i];
V[i] = if chi < L { V[input.G[input.S[i] + chi]] + 1 } else { 0 };
/*
if neibor_levels[i * 12 + V[i] as usize - 1] == 0 {
V[i] = before_v;
continue 'LOOP;
}
*/
let delta = input.A[i] * (V[i] - before_v) as i32;
if delta >= 0 || mt.gen_bool((delta as f64 / T).exp()) {
}
else {
// not accept
V[i] = before_v;
continue 'LOOP;
}
// are the neiborhoods valid ?
{
for &j in input.nexts(i) {
if V[j] == 0 || V[j] - before_v != 1 { continue; } // PLAY OF THE GAME
// V[j] == before_v + 1
// need before_v
if neibor_levels[j * 12 + before_v as usize] <= 1 {
V[i] = before_v;
continue 'LOOP
}
}
}
{
now_score += delta;
for &j in input.nexts(i) {
neibor_levels[j * 12 + before_v as usize] -= 1;
neibor_levels[j * 12 + V[i] as usize] += 1;
}
// eprintln!("{} {}", i, V[i]);
}
}
else {
let (i, j) = input.E[mt.gen_range(0..input.M)];
if V[i] == V[j] { continue; }
/*
if neibor_levels[i * 12 + V[i] as usize - 1] == 0 {
V[i] = before_v;
continue 'LOOP;
}
*/
if V[i] - V[j] != 1 && V[i] > 0 && neibor_levels[j * 12 + V[i] as usize - 1] == 0 {
continue 'LOOP;
}
if V[j] - V[i] != 1 && V[j] > 0 && neibor_levels[i * 12 + V[j] as usize - 1] == 0 {
continue 'LOOP;
}
let delta = input.A[i] * (V[j] - V[i]) + input.A[j] * (V[i] - V[j]);
if delta >= 0 || mt.gen_bool((delta as f64 / T).exp()) {
}
else {
// not accept
continue 'LOOP;
}
// are the neiborhoods valid ?
{
for &k in input.nexts(i) {
if k == j || V[k] == 0 { continue; }
if V[k] - V[i] == 1 {
if neibor_levels[k * 12 + V[i] as usize] <= 1 && !input.B.get(k * N + j) {
continue 'LOOP;
}
}
}
}
{
for &k in input.nexts(j) {
if k == i || V[k] == 0 { continue; }
if V[k] - V[j] == 1 {
if neibor_levels[k * 12 + V[j] as usize] <= 1 && !input.B.get(k * N + i) {
continue 'LOOP;
}
}
}
}
{
for &k in input.nexts(i) {
neibor_levels[k * 12 + V[i] as usize] -= 1;
neibor_levels[k * 12 + V[j] as usize] += 1;
}
for &k in input.nexts(j) {
neibor_levels[k * 12 + V[j] as usize] -= 1;
neibor_levels[k * 12 + V[i] as usize] += 1;
}
V.swap(i, j);
now_score += delta;
// eprintln!("{} {}", i, V[i]);
/*
eprintln!("i {} {}", i, V[i]);
for &k in input.nexts(i) {
eprintln!("{} {}", k, V[k]);
}
eprintln!("j {} {}", j, V[j]);
for &k in input.nexts(j) {
eprintln!("{} {}", k, V[k]);
}
{
for i in 0..N {
if V[i] == 0 {
continue;
}
let mut ok = false;
for &j in input.nexts(i) {
if V[i] - V[j] == 1 {
ok = true;
}
}
if !ok {
eprintln!("no {} {}", i, V[i]);
for &j in input.nexts(i) {
eprintln!("{} {}", j, V[j]);
}
assert!(false);
}
}
}
*/
}
}
}
}
max_score = now_score;
max_answer = V.clone();
eprintln!("{}", max_score);
V = max_answer;
let mut P = [!0; N];
for &(u, v) in &input.E {
if V[u] + 1 == V[v] {
P[v] = u;
}
if V[v] + 1 == V[u] {
P[u] = v;
}
}
for i in 0..N {
print!("{} ", if P[i] == !0 { -1 } else { P[i] as isize });
}
println!();
/*
for i in 0..N {
eprintln!("{} {}", i, V[i]);
}
*/
}
struct Input {
M: usize,
A: [i32; N],
E: Vec<(usize, usize)>,
P: Vec<(usize, usize)>,
G: Vec<usize>,
S: [usize; N + 1],
B: Bitset,
}
impl Input {
fn from_stdin() -> Input {
input! {
_n: usize,
M: usize,
_h: usize,
A: [i32; N],
E: [(usize, usize); M],
P: [(usize, usize); N],
}
let mut g = vec![vec![]; N];
let mut B = Bitset::new(N * N);
for i in 0..M {
let (u, v) = E[i];
B.set(u * N + v, true);
B.set(v * N + u, true);
g[u].push(v);
g[v].push(u);
}
let mut G = vec![];
G.reserve(M * 2);
let mut S = [0; N + 1];
for i in 0..N {
for &j in &g[i] {
G.push(j);
}
S[i + 1] = G.len();
}
Input {
M,
A: A.try_into().unwrap(),
E,
P,
G,
S,
B,
}
}
#[inline(always)]
fn nexts(&self, i: usize) -> &[usize] {
&self.G[self.S[i]..self.S[i + 1]]
}
}
use itertools::Itertools;
use proconio::{input, input_interactive};
use rand::prelude::*;
use rand_pcg::Pcg64Mcg;
type Mt = Pcg64Mcg;
pub fn get_time() -> f64 {
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;
}
#[cfg(not(feature = "local"))]
{
ms - STIME
}
}
}
use std::cell::RefCell;
pub struct UnionFind {
par: RefCell<Vec<usize>>,
sz: Vec<usize>,
}
impl UnionFind {
pub fn new(n: usize) -> Self {
Self {
par: RefCell::new((0..n).collect()),
sz: std::iter::repeat(1).take(n).collect(),
}
}
pub fn root(&self, v: usize) -> usize {
let p = self.par.borrow()[v];
if p == v { v }
else {
let r = self.root(p);
self.par.borrow_mut()[v] = r;
r
}
}
pub fn unite(&mut self, a: usize, b: usize) -> Option<(usize, usize)> {
let a = self.root(a);
let b = self.root(b);
if a == b { None }
else if self.sz[a] < self.sz[b] {
self.par.borrow_mut()[a] = b;
self.sz[b] += self.sz[a];
Some((b, a))
}
else {
self.par.borrow_mut()[b] = a;
self.sz[a] += self.sz[b];
Some((a, b))
}
}
}
pub struct Bitset {
b: Vec<u64>,
n: usize,
}
impl Bitset {
pub fn new(n: usize) -> Self {
let s = (n + 63) / 64;
Self { b: std::iter::repeat(0).take(s).collect(), n }
}
pub fn set(&mut self, i: usize, v: bool) {
assert!(i < self.n);
match v {
true => self.b[i / 64] |= 1u64 << (i & 63),
false => self.b[i / 64] &= !(1u64 << (i & 63)),
}
}
pub fn get(&self, i: usize) -> bool {
assert!(i < self.n);
(self.b[i / 64] & (1u64 << (i & 63))) > 0
}
}
Submission Info
| Submission Time | |
|---|---|
| Task | A - Christmas Tree Cutting |
| User | niuez |
| Language | Rust (rustc 1.70.0) |
| Score | 76605906 |
| Code Size | 11230 Byte |
| Status | AC |
| Exec Time | 2000 ms |
| Memory | 3096 KiB |
Compile Error
warning: unused import: `itertools::Itertools`
--> src/main.rs:294:5
|
294 | use itertools::Itertools;
| ^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
warning: unused import: `input_interactive`
--> src/main.rs:295:23
|
295 | use proconio::{input, input_interactive};
| ^^^^^^^^^^^^^^^^^
warning: value assigned to `max_score` is never read
--> src/main.rs:38:13
|
38 | let mut max_score = now_score;
| ^^^^^^^^^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` on by default
warning: value assigned to `max_answer` is never read
--> src/main.rs:39:13
|
39 | let mut max_answer = V.clone();
| ^^^^^^^^^^
|
= help: maybe it is overwritten before being read?
Judge Result
| Set Name | test_ALL | ||
|---|---|---|---|
| Score / Max Score | 76605906 / 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 | 1999 ms | 2968 KiB |
| test_0001.txt | AC | 1999 ms | 2800 KiB |
| test_0002.txt | AC | 1999 ms | 3096 KiB |
| test_0003.txt | AC | 1999 ms | 2944 KiB |
| test_0004.txt | AC | 1999 ms | 2924 KiB |
| test_0005.txt | AC | 1999 ms | 3024 KiB |
| test_0006.txt | AC | 1999 ms | 2932 KiB |
| test_0007.txt | AC | 1999 ms | 2964 KiB |
| test_0008.txt | AC | 1999 ms | 3028 KiB |
| test_0009.txt | AC | 1999 ms | 2836 KiB |
| test_0010.txt | AC | 1999 ms | 2896 KiB |
| test_0011.txt | AC | 1999 ms | 2804 KiB |
| test_0012.txt | AC | 1999 ms | 2832 KiB |
| test_0013.txt | AC | 1999 ms | 2996 KiB |
| test_0014.txt | AC | 1999 ms | 2996 KiB |
| test_0015.txt | AC | 1999 ms | 3096 KiB |
| test_0016.txt | AC | 1999 ms | 3004 KiB |
| test_0017.txt | AC | 1999 ms | 2920 KiB |
| test_0018.txt | AC | 1999 ms | 2980 KiB |
| test_0019.txt | AC | 1999 ms | 2808 KiB |
| test_0020.txt | AC | 1999 ms | 3088 KiB |
| test_0021.txt | AC | 1999 ms | 2844 KiB |
| test_0022.txt | AC | 1999 ms | 3036 KiB |
| test_0023.txt | AC | 1999 ms | 3032 KiB |
| test_0024.txt | AC | 1999 ms | 2868 KiB |
| test_0025.txt | AC | 1999 ms | 2968 KiB |
| test_0026.txt | AC | 1999 ms | 3036 KiB |
| test_0027.txt | AC | 1999 ms | 2968 KiB |
| test_0028.txt | AC | 1999 ms | 2864 KiB |
| test_0029.txt | AC | 1999 ms | 2860 KiB |
| test_0030.txt | AC | 1999 ms | 2928 KiB |
| test_0031.txt | AC | 1999 ms | 2936 KiB |
| test_0032.txt | AC | 1999 ms | 2868 KiB |
| test_0033.txt | AC | 1999 ms | 2972 KiB |
| test_0034.txt | AC | 1999 ms | 2984 KiB |
| test_0035.txt | AC | 1999 ms | 2964 KiB |
| test_0036.txt | AC | 1999 ms | 2996 KiB |
| test_0037.txt | AC | 1999 ms | 3036 KiB |
| test_0038.txt | AC | 1999 ms | 2932 KiB |
| test_0039.txt | AC | 1999 ms | 3092 KiB |
| test_0040.txt | AC | 1999 ms | 3028 KiB |
| test_0041.txt | AC | 1999 ms | 2800 KiB |
| test_0042.txt | AC | 1999 ms | 2992 KiB |
| test_0043.txt | AC | 1999 ms | 2928 KiB |
| test_0044.txt | AC | 1999 ms | 3088 KiB |
| test_0045.txt | AC | 1999 ms | 2928 KiB |
| test_0046.txt | AC | 1999 ms | 2984 KiB |
| test_0047.txt | AC | 1999 ms | 3092 KiB |
| test_0048.txt | AC | 1999 ms | 3016 KiB |
| test_0049.txt | AC | 1999 ms | 2932 KiB |
| test_0050.txt | AC | 1999 ms | 2960 KiB |
| test_0051.txt | AC | 1999 ms | 2932 KiB |
| test_0052.txt | AC | 1999 ms | 3036 KiB |
| test_0053.txt | AC | 1999 ms | 2976 KiB |
| test_0054.txt | AC | 1999 ms | 2956 KiB |
| test_0055.txt | AC | 1999 ms | 2872 KiB |
| test_0056.txt | AC | 1999 ms | 2804 KiB |
| test_0057.txt | AC | 1999 ms | 2964 KiB |
| test_0058.txt | AC | 1999 ms | 2924 KiB |
| test_0059.txt | AC | 1999 ms | 3028 KiB |
| test_0060.txt | AC | 1999 ms | 2800 KiB |
| test_0061.txt | AC | 1999 ms | 3096 KiB |
| test_0062.txt | AC | 2000 ms | 2944 KiB |
| test_0063.txt | AC | 1999 ms | 2884 KiB |
| test_0064.txt | AC | 1999 ms | 2936 KiB |
| test_0065.txt | AC | 1999 ms | 2924 KiB |
| test_0066.txt | AC | 1999 ms | 2928 KiB |
| test_0067.txt | AC | 1999 ms | 3032 KiB |
| test_0068.txt | AC | 1999 ms | 2964 KiB |
| test_0069.txt | AC | 1999 ms | 2968 KiB |
| test_0070.txt | AC | 1999 ms | 2920 KiB |
| test_0071.txt | AC | 1999 ms | 2932 KiB |
| test_0072.txt | AC | 1999 ms | 2864 KiB |
| test_0073.txt | AC | 1999 ms | 2800 KiB |
| test_0074.txt | AC | 1999 ms | 3092 KiB |
| test_0075.txt | AC | 1999 ms | 3028 KiB |
| test_0076.txt | AC | 1999 ms | 3088 KiB |
| test_0077.txt | AC | 1999 ms | 3000 KiB |
| test_0078.txt | AC | 1999 ms | 2924 KiB |
| test_0079.txt | AC | 1999 ms | 2952 KiB |
| test_0080.txt | AC | 1999 ms | 2940 KiB |
| test_0081.txt | AC | 1999 ms | 2936 KiB |
| test_0082.txt | AC | 1999 ms | 3044 KiB |
| test_0083.txt | AC | 1999 ms | 3096 KiB |
| test_0084.txt | AC | 1999 ms | 2956 KiB |
| test_0085.txt | AC | 1999 ms | 2804 KiB |
| test_0086.txt | AC | 1999 ms | 2860 KiB |
| test_0087.txt | AC | 1999 ms | 2972 KiB |
| test_0088.txt | AC | 1999 ms | 3032 KiB |
| test_0089.txt | AC | 1999 ms | 3024 KiB |
| test_0090.txt | AC | 1999 ms | 2968 KiB |
| test_0091.txt | AC | 1999 ms | 2840 KiB |
| test_0092.txt | AC | 1999 ms | 2932 KiB |
| test_0093.txt | AC | 1999 ms | 2852 KiB |
| test_0094.txt | AC | 1999 ms | 2992 KiB |
| test_0095.txt | AC | 1999 ms | 2896 KiB |
| test_0096.txt | AC | 1999 ms | 2940 KiB |
| test_0097.txt | AC | 1999 ms | 3096 KiB |
| test_0098.txt | AC | 1999 ms | 2940 KiB |
| test_0099.txt | AC | 1999 ms | 2932 KiB |
| test_0100.txt | AC | 1999 ms | 2892 KiB |
| test_0101.txt | AC | 1999 ms | 2956 KiB |
| test_0102.txt | AC | 1999 ms | 2996 KiB |
| test_0103.txt | AC | 1999 ms | 2952 KiB |
| test_0104.txt | AC | 1999 ms | 2996 KiB |
| test_0105.txt | AC | 1999 ms | 2892 KiB |
| test_0106.txt | AC | 1999 ms | 2896 KiB |
| test_0107.txt | AC | 1999 ms | 2936 KiB |
| test_0108.txt | AC | 1999 ms | 2932 KiB |
| test_0109.txt | AC | 1999 ms | 3036 KiB |
| test_0110.txt | AC | 1999 ms | 2964 KiB |
| test_0111.txt | AC | 1999 ms | 2940 KiB |
| test_0112.txt | AC | 1999 ms | 2892 KiB |
| test_0113.txt | AC | 1999 ms | 2932 KiB |
| test_0114.txt | AC | 1999 ms | 3092 KiB |
| test_0115.txt | AC | 1999 ms | 2868 KiB |
| test_0116.txt | AC | 1999 ms | 2896 KiB |
| test_0117.txt | AC | 1999 ms | 2864 KiB |
| test_0118.txt | AC | 1999 ms | 3024 KiB |
| test_0119.txt | AC | 1999 ms | 3096 KiB |
| test_0120.txt | AC | 1999 ms | 3080 KiB |
| test_0121.txt | AC | 1999 ms | 2900 KiB |
| test_0122.txt | AC | 1999 ms | 2972 KiB |
| test_0123.txt | AC | 1999 ms | 2864 KiB |
| test_0124.txt | AC | 1999 ms | 3004 KiB |
| test_0125.txt | AC | 1999 ms | 2996 KiB |
| test_0126.txt | AC | 1999 ms | 3096 KiB |
| test_0127.txt | AC | 1999 ms | 3036 KiB |
| test_0128.txt | AC | 1999 ms | 3096 KiB |
| test_0129.txt | AC | 1999 ms | 3032 KiB |
| test_0130.txt | AC | 1999 ms | 2868 KiB |
| test_0131.txt | AC | 1999 ms | 2996 KiB |
| test_0132.txt | AC | 1999 ms | 2968 KiB |
| test_0133.txt | AC | 1999 ms | 3032 KiB |
| test_0134.txt | AC | 1999 ms | 2920 KiB |
| test_0135.txt | AC | 1999 ms | 3092 KiB |
| test_0136.txt | AC | 1999 ms | 3032 KiB |
| test_0137.txt | AC | 1999 ms | 2964 KiB |
| test_0138.txt | AC | 1999 ms | 2868 KiB |
| test_0139.txt | AC | 1999 ms | 2864 KiB |
| test_0140.txt | AC | 1999 ms | 2920 KiB |
| test_0141.txt | AC | 1999 ms | 2972 KiB |
| test_0142.txt | AC | 1999 ms | 2972 KiB |
| test_0143.txt | AC | 1999 ms | 3032 KiB |
| test_0144.txt | AC | 1999 ms | 2920 KiB |
| test_0145.txt | AC | 1999 ms | 3032 KiB |
| test_0146.txt | AC | 1999 ms | 2924 KiB |
| test_0147.txt | AC | 1999 ms | 2924 KiB |
| test_0148.txt | AC | 1999 ms | 2740 KiB |
| test_0149.txt | AC | 1999 ms | 2896 KiB |