提出 #57822711


ソースコード 拡げる

#![allow(non_snake_case)]

use proconio::input;

fn main() {
    get_time();
    input! {
        n: usize,
        mut ps: [(i32, i32); n],
    }
    ps.sort_by_key(|p| p.0 + p.1);
    let mut hash = 0;
    for &p in &ps {
        hash += f(p);
    }
    let mut beam = vec![State {
        ps,
        id: !0,
        eval: 0,
        hash,
    }];
    let mut trace = Trace::new();
    for _ in 0..n - 1 {
        let mut cand = BoundedSortedList::new(2200);
        for k in 0..beam.len() {
            let State { ref ps, eval, .. } = beam[k];
            for i in (0..ps.len()).rev() {
                if !cand.can_insert(Reverse(eval + ps[i].0 as i64 + ps[i].1 as i64)) {
                    break;
                }
                for j in (0..i).rev() {
                    if !cand.can_insert(Reverse(eval + ps[j].0 as i64 + ps[j].1 as i64)) {
                        break;
                    }
                    let d = (ps[i].0.min(ps[j].0) + ps[i].1.min(ps[j].1)) as i64;
                    if cand.can_insert(Reverse(eval + d)) {
                        cand.insert(Reverse(eval + d), (k, i, j));
                    }
                }
            }
        }
        let mut next = vec![];
        let mut used = FxHashSet::default();
        for (Reverse(eval), (k, i, j)) in cand.list() {
            let p = beam[k].ps[i];
            let q = beam[k].ps[j];
            let r = (p.0.min(q.0), p.1.min(q.1));
            let hash = beam[k].hash - f(p) - f(q) + f(r);
            if !used.insert(hash) {
                continue;
            }
            let mut ps = beam[k].ps.clone();
            ps.remove(i);
            ps.remove(j);
            ps.push(r);
            let id = trace.add((r, p), beam[k].id);
            let id = trace.add((r, q), id);
            next.push(State { ps, id, eval, hash });
        }
        beam = next;
    }
    assert_eq!(beam.len(), 1);
    let id = beam[0].id;
    let mut out = trace.get(id);
    out.reverse();
    write_output(&out);
    eprintln!("Time = {:.3}", get_time());
}

fn f(p: (i32, i32)) -> i64 {
    (p.0 as i64 + 1) * 1000000007 + p.1 as i64 + 1
}

struct State {
    ps: Vec<(i32, i32)>,
    id: usize,
    eval: i64,
    hash: i64,
}

fn write_output(out: &Vec<((i32, i32), (i32, i32))>) {
    println!("{}", out.len());
    for ((x1, y1), (x2, y2)) in out {
        println!("{} {} {} {}", x1, y1, x2, y2);
    }
}

// ここからライブラリ

pub trait SetMinMax {
    fn setmin(&mut self, v: Self) -> bool;
    fn setmax(&mut self, v: Self) -> bool;
}
impl<T> SetMinMax for T
where
    T: PartialOrd,
{
    fn setmin(&mut self, v: T) -> bool {
        *self > v && {
            *self = v;
            true
        }
    }
    fn setmax(&mut self, v: T) -> bool {
        *self < v && {
            *self = v;
            true
        }
    }
}

#[macro_export]
macro_rules! mat {
	($($e:expr),*) => { vec![$($e),*] };
	($($e:expr,)*) => { vec![$($e),*] };
	($e:expr; $d:expr) => { vec![$e; $d] };
	($e:expr; $d:expr $(; $ds:expr)+) => { vec![mat![$e $(; $ds)*]; $d] };
}

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;
        }
        // ローカル環境とジャッジ環境の実行速度差はget_timeで吸収しておくと便利
        #[cfg(feature = "local")]
        {
            (ms - STIME) * 1.0
        }
        #[cfg(not(feature = "local"))]
        {
            ms - STIME
        }
    }
}

pub struct Trace<T: Copy> {
    log: Vec<(T, usize)>,
}

impl<T: Copy> Trace<T> {
    pub fn new() -> Self {
        Trace { log: vec![] }
    }
    pub fn add(&mut self, c: T, p: usize) -> usize {
        self.log.push((c, p));
        self.log.len() - 1
    }
    pub fn get(&self, mut i: usize) -> Vec<T> {
        let mut out = vec![];
        while i != !0 {
            out.push(self.log[i].0);
            i = self.log[i].1;
        }
        out.reverse();
        out
    }
}

use rustc_hash::FxHashSet;
use std::{cmp::Reverse, collections::BinaryHeap};

#[derive(Clone, Debug)]
struct Entry<K, V> {
    k: K,
    v: V,
}

impl<K: PartialOrd, V> Ord for Entry<K, V> {
    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
        self.partial_cmp(other).unwrap()
    }
}

impl<K: PartialOrd, V> PartialOrd for Entry<K, V> {
    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
        self.k.partial_cmp(&other.k)
    }
}

impl<K: PartialEq, V> PartialEq for Entry<K, V> {
    fn eq(&self, other: &Self) -> bool {
        self.k.eq(&other.k)
    }
}

impl<K: PartialEq, V> Eq for Entry<K, V> {}

/// K が小さいトップn個を保持
#[derive(Clone, Debug)]
pub struct BoundedSortedList<K: PartialOrd + Copy, V: Clone> {
    que: BinaryHeap<Entry<K, V>>,
    size: usize,
}

impl<K: PartialOrd + Copy, V: Clone> BoundedSortedList<K, V> {
    pub fn new(size: usize) -> Self {
        Self {
            que: BinaryHeap::with_capacity(size),
            size,
        }
    }
    pub fn can_insert(&self, k: K) -> bool {
        self.que.len() < self.size || self.que.peek().unwrap().k > k
    }
    pub fn insert(&mut self, k: K, v: V) {
        if self.que.len() < self.size {
            self.que.push(Entry { k, v });
        } else if let Some(mut top) = self.que.peek_mut() {
            if top.k > k {
                top.k = k;
                top.v = v;
            }
        }
    }
    pub fn list(&self) -> Vec<(K, V)> {
        let v = self.que.clone().into_sorted_vec();
        v.into_iter().map(|e| (e.k, e.v)).collect()
    }
    pub fn len(&self) -> usize {
        self.que.len()
    }
}

提出情報

提出日時
問題 A - Soda
ユーザ wata_admin
言語 Rust (rustc 1.70.0)
得点 5492589300
コード長 6027 Byte
結果 AC
実行時間 1924 ms
メモリ 63584 KiB

ジャッジ結果

セット名 test_ALL
得点 / 配点 5492589300 / 150000000000
結果
AC × 150
セット名 テストケース
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
ケース名 結果 実行時間 メモリ
test_0000.txt AC 1872 ms 63584 KiB
test_0001.txt AC 1859 ms 60164 KiB
test_0002.txt AC 1854 ms 61080 KiB
test_0003.txt AC 1839 ms 61144 KiB
test_0004.txt AC 1858 ms 60048 KiB
test_0005.txt AC 1872 ms 60976 KiB
test_0006.txt AC 1899 ms 62108 KiB
test_0007.txt AC 1907 ms 61520 KiB
test_0008.txt AC 1855 ms 60864 KiB
test_0009.txt AC 1892 ms 61272 KiB
test_0010.txt AC 1856 ms 60412 KiB
test_0011.txt AC 1889 ms 60292 KiB
test_0012.txt AC 1886 ms 61528 KiB
test_0013.txt AC 1837 ms 61324 KiB
test_0014.txt AC 1858 ms 61956 KiB
test_0015.txt AC 1859 ms 60664 KiB
test_0016.txt AC 1855 ms 59644 KiB
test_0017.txt AC 1870 ms 61092 KiB
test_0018.txt AC 1868 ms 61508 KiB
test_0019.txt AC 1831 ms 60952 KiB
test_0020.txt AC 1843 ms 62888 KiB
test_0021.txt AC 1888 ms 61668 KiB
test_0022.txt AC 1845 ms 58736 KiB
test_0023.txt AC 1878 ms 60512 KiB
test_0024.txt AC 1858 ms 60528 KiB
test_0025.txt AC 1850 ms 60148 KiB
test_0026.txt AC 1847 ms 61696 KiB
test_0027.txt AC 1837 ms 60936 KiB
test_0028.txt AC 1875 ms 62044 KiB
test_0029.txt AC 1825 ms 60184 KiB
test_0030.txt AC 1857 ms 59980 KiB
test_0031.txt AC 1858 ms 59756 KiB
test_0032.txt AC 1876 ms 61580 KiB
test_0033.txt AC 1857 ms 62080 KiB
test_0034.txt AC 1869 ms 61980 KiB
test_0035.txt AC 1883 ms 61104 KiB
test_0036.txt AC 1866 ms 61248 KiB
test_0037.txt AC 1864 ms 63108 KiB
test_0038.txt AC 1894 ms 60808 KiB
test_0039.txt AC 1819 ms 59392 KiB
test_0040.txt AC 1863 ms 61016 KiB
test_0041.txt AC 1820 ms 60752 KiB
test_0042.txt AC 1861 ms 59292 KiB
test_0043.txt AC 1863 ms 60452 KiB
test_0044.txt AC 1839 ms 62048 KiB
test_0045.txt AC 1858 ms 60564 KiB
test_0046.txt AC 1822 ms 59948 KiB
test_0047.txt AC 1838 ms 62388 KiB
test_0048.txt AC 1812 ms 61348 KiB
test_0049.txt AC 1874 ms 62620 KiB
test_0050.txt AC 1886 ms 60556 KiB
test_0051.txt AC 1871 ms 59116 KiB
test_0052.txt AC 1830 ms 62356 KiB
test_0053.txt AC 1858 ms 63120 KiB
test_0054.txt AC 1854 ms 59560 KiB
test_0055.txt AC 1870 ms 60352 KiB
test_0056.txt AC 1881 ms 61332 KiB
test_0057.txt AC 1924 ms 59740 KiB
test_0058.txt AC 1846 ms 62156 KiB
test_0059.txt AC 1874 ms 60132 KiB
test_0060.txt AC 1846 ms 60600 KiB
test_0061.txt AC 1830 ms 60948 KiB
test_0062.txt AC 1826 ms 61108 KiB
test_0063.txt AC 1866 ms 62068 KiB
test_0064.txt AC 1874 ms 60380 KiB
test_0065.txt AC 1877 ms 61780 KiB
test_0066.txt AC 1872 ms 60100 KiB
test_0067.txt AC 1815 ms 61200 KiB
test_0068.txt AC 1883 ms 61636 KiB
test_0069.txt AC 1847 ms 61452 KiB
test_0070.txt AC 1881 ms 60120 KiB
test_0071.txt AC 1854 ms 61004 KiB
test_0072.txt AC 1839 ms 60736 KiB
test_0073.txt AC 1845 ms 61176 KiB
test_0074.txt AC 1845 ms 59760 KiB
test_0075.txt AC 1872 ms 60668 KiB
test_0076.txt AC 1864 ms 60788 KiB
test_0077.txt AC 1831 ms 60288 KiB
test_0078.txt AC 1839 ms 61208 KiB
test_0079.txt AC 1917 ms 58408 KiB
test_0080.txt AC 1858 ms 59860 KiB
test_0081.txt AC 1875 ms 60140 KiB
test_0082.txt AC 1864 ms 59364 KiB
test_0083.txt AC 1838 ms 61604 KiB
test_0084.txt AC 1883 ms 60720 KiB
test_0085.txt AC 1875 ms 60408 KiB
test_0086.txt AC 1879 ms 61188 KiB
test_0087.txt AC 1909 ms 61732 KiB
test_0088.txt AC 1825 ms 61684 KiB
test_0089.txt AC 1863 ms 62124 KiB
test_0090.txt AC 1854 ms 61064 KiB
test_0091.txt AC 1873 ms 60852 KiB
test_0092.txt AC 1869 ms 60404 KiB
test_0093.txt AC 1871 ms 61028 KiB
test_0094.txt AC 1902 ms 60852 KiB
test_0095.txt AC 1881 ms 61520 KiB
test_0096.txt AC 1890 ms 62640 KiB
test_0097.txt AC 1841 ms 61392 KiB
test_0098.txt AC 1793 ms 60748 KiB
test_0099.txt AC 1820 ms 60832 KiB
test_0100.txt AC 1847 ms 60676 KiB
test_0101.txt AC 1839 ms 60260 KiB
test_0102.txt AC 1877 ms 61328 KiB
test_0103.txt AC 1884 ms 60356 KiB
test_0104.txt AC 1883 ms 61956 KiB
test_0105.txt AC 1842 ms 61560 KiB
test_0106.txt AC 1836 ms 61180 KiB
test_0107.txt AC 1864 ms 60044 KiB
test_0108.txt AC 1915 ms 60328 KiB
test_0109.txt AC 1873 ms 61456 KiB
test_0110.txt AC 1886 ms 62376 KiB
test_0111.txt AC 1814 ms 59148 KiB
test_0112.txt AC 1853 ms 60132 KiB
test_0113.txt AC 1891 ms 62136 KiB
test_0114.txt AC 1881 ms 59616 KiB
test_0115.txt AC 1880 ms 61764 KiB
test_0116.txt AC 1841 ms 60256 KiB
test_0117.txt AC 1891 ms 61192 KiB
test_0118.txt AC 1865 ms 60328 KiB
test_0119.txt AC 1877 ms 61436 KiB
test_0120.txt AC 1912 ms 59996 KiB
test_0121.txt AC 1876 ms 59164 KiB
test_0122.txt AC 1861 ms 59792 KiB
test_0123.txt AC 1833 ms 60876 KiB
test_0124.txt AC 1856 ms 61280 KiB
test_0125.txt AC 1876 ms 62140 KiB
test_0126.txt AC 1842 ms 61436 KiB
test_0127.txt AC 1877 ms 60920 KiB
test_0128.txt AC 1841 ms 60212 KiB
test_0129.txt AC 1864 ms 61472 KiB
test_0130.txt AC 1851 ms 61716 KiB
test_0131.txt AC 1894 ms 61356 KiB
test_0132.txt AC 1836 ms 60004 KiB
test_0133.txt AC 1890 ms 62376 KiB
test_0134.txt AC 1836 ms 61528 KiB
test_0135.txt AC 1883 ms 61948 KiB
test_0136.txt AC 1846 ms 60680 KiB
test_0137.txt AC 1920 ms 60224 KiB
test_0138.txt AC 1830 ms 60676 KiB
test_0139.txt AC 1854 ms 59584 KiB
test_0140.txt AC 1843 ms 61724 KiB
test_0141.txt AC 1852 ms 60360 KiB
test_0142.txt AC 1845 ms 60160 KiB
test_0143.txt AC 1835 ms 61388 KiB
test_0144.txt AC 1865 ms 62448 KiB
test_0145.txt AC 1848 ms 59260 KiB
test_0146.txt AC 1887 ms 60496 KiB
test_0147.txt AC 1854 ms 62112 KiB
test_0148.txt AC 1882 ms 62016 KiB
test_0149.txt AC 1860 ms 61632 KiB