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
AC × 150
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