提出 #49628945


ソースコード 拡げる

use std::collections::{BTreeSet, HashSet, VecDeque};

use proconio::input;

fn main() {
    input! {
        n: usize,
    }
    let mut t = vec![];
    for _ in 0..n {
        input! {
            k_i: usize,
            t_i: [usize; k_i],
        }
        t.push(t_i);
    }
    input! {
        m: usize,
        a: [usize; m],
    }

    let mut max1 = BTreeSet::new();
    let mut max2 = BTreeSet::new();
    for i in 0..n {
        max1.insert((t[i][0], i, 0));
        if 1 < t[i].len() {
            max2.insert((t[i][1], i, 1));
        }
    }
    let mut used = HashSet::new();
    for a_i in a {
        match a_i {
            1 => {
                let (x, j, k) = max1.pop_last().unwrap();
                used.insert((x, j, k));
                let mut next = VecDeque::new();
                for l in k + 1..t[j].len() {
                    if next.len() == 2 {
                        break;
                    }
                    if used.contains(&(t[j][l], j, l)) {
                        continue;
                    }
                    next.push_back((t[j][l], j, l));
                }
                if let Some(v) = next.pop_front() {
                    max1.insert(v);
                    max2.remove(&v);
                }
                if let Some(v) = next.pop_front() {
                    max2.insert(v);
                }
                println!("{}", x);
            }
            2 => match (max1.pop_last(), max2.pop_last()) {
                (None, None) | (None, Some(_)) => unreachable!(),
                (Some((x, j, k)), None) => {
                    used.insert((x, j, k));
                    let mut next = VecDeque::new();
                    for l in k + 1..t[j].len() {
                        if next.len() == 2 {
                            break;
                        }
                        if used.contains(&(t[j][l], j, l)) {
                            continue;
                        }
                        next.push_back((t[j][l], j, l));
                    }
                    if let Some(v) = next.pop_front() {
                        max1.insert(v);
                        max2.remove(&v);
                    }
                    if let Some(v) = next.pop_front() {
                        max2.insert(v);
                    }
                    println!("{}", x);
                }
                (Some((x1, j1, k1)), Some((x2, j2, k2))) => {
                    if x1 > x2 {
                        max2.insert((x2, j2, k2));
                        let (x, j, k) = (x1, j1, k1);
                        used.insert((x, j, k));
                        let mut next = VecDeque::new();
                        for l in k + 1..t[j].len() {
                            if next.len() == 2 {
                                break;
                            }
                            if used.contains(&(t[j][l], j, l)) {
                                continue;
                            }
                            next.push_back((t[j][l], j, l));
                        }
                        if let Some(v) = next.pop_front() {
                            max1.insert(v);
                            max2.remove(&v);
                        }
                        if let Some(v) = next.pop_front() {
                            max2.insert(v);
                        }
                        println!("{}", x);
                    } else {
                        max1.insert((x1, j1, k1));
                        let (x, j, k) = (x2, j2, k2);
                        used.insert((x, j, k));
                        let mut next = VecDeque::new();
                        for l in k + 1..t[j].len() {
                            if next.len() == 2 {
                                break;
                            }
                            if used.contains(&(t[j][l], j, l)) {
                                continue;
                            }
                            next.push_back((t[j][l], j, l));
                        }
                        if let Some(v) = next.pop_front() {
                            max2.insert(v);
                        }
                        println!("{}", x);
                    }
                }
            },
            _ => unreachable!(),
        }
    }
}

提出情報

提出日時
問題 L - スーパーマーケット
ユーザ bouzuya
言語 Rust (rustc 1.70.0)
得点 6
コード長 4334 Byte
結果 AC
実行時間 457 ms
メモリ 40856 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 6 / 6
結果
AC × 2
AC × 18
セット名 テストケース
Sample sample_01.txt, sample_02.txt
All max_01.txt, max_02.txt, max_03.txt, max_04.txt, max_05.txt, max_06.txt, max_07.txt, max_08.txt, max_09.txt, max_10.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, sample_01.txt, sample_02.txt
ケース名 結果 実行時間 メモリ
max_01.txt AC 454 ms 40856 KiB
max_02.txt AC 457 ms 40836 KiB
max_03.txt AC 371 ms 30208 KiB
max_04.txt AC 380 ms 30116 KiB
max_05.txt AC 380 ms 30168 KiB
max_06.txt AC 399 ms 30192 KiB
max_07.txt AC 400 ms 30224 KiB
max_08.txt AC 417 ms 30900 KiB
max_09.txt AC 424 ms 31204 KiB
max_10.txt AC 436 ms 32532 KiB
random_01.txt AC 94 ms 9032 KiB
random_02.txt AC 96 ms 9772 KiB
random_03.txt AC 70 ms 14708 KiB
random_04.txt AC 45 ms 6680 KiB
random_05.txt AC 20 ms 8864 KiB
random_06.txt AC 40 ms 5304 KiB
sample_01.txt AC 0 ms 2092 KiB
sample_02.txt AC 0 ms 1824 KiB