提出 #65814623


ソースコード 拡げる

use proconio::input;

const HEIGHT: usize = 30;

fn main() {
    input! {
        q: usize,
        queries: [usize; q],
    }
    let mut root = SegtreeNode {
        children: [None, None],
        value: Value {
            sum: [0, 0],
            parity: 0,
        },
    };
    let mut prev_ans = 0;
    for &query in &queries {
        let query = (prev_ans + query) % 1_000_000_000 + 1;
        root.insert(query, HEIGHT);
        let ans = root.value.sum[0];
        println!("{ans}");
        prev_ans = ans;
    }
}

#[derive(PartialEq, Eq, Clone, Copy)]
struct Value {
    sum: [usize; 2],
    parity: usize,
}
impl std::fmt::Debug for Value {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_tuple("")
            .field(&self.sum)
            .field(&self.parity)
            .finish()
    }
}

#[derive(Debug, PartialEq, Eq, Clone)]
struct SegtreeNode {
    children: [Option<Box<SegtreeNode>>; 2],
    value: Value,
}
impl SegtreeNode {
    fn insert(&mut self, query: usize, height: usize) {
        if height == 0 {
            self.value.sum[self.value.parity] += query;
            self.value.parity ^= 1;
            return;
        }
        let dir = (query >> (height - 1)) & 1;
        if self.children[dir].is_none() {
            self.children[dir] = Some(Box::new(SegtreeNode {
                children: [None, None],
                value: Value {
                    sum: [0, 0],
                    parity: 0,
                },
            }));
        }
        let child = self.children[dir].as_mut().unwrap();
        child.insert(query, height - 1);
        let value = [
            self.children[0].as_ref().map_or([0, 0], |c| c.value.sum),
            self.children[1].as_ref().map_or([0, 0], |c| c.value.sum),
        ];
        let parity = [
            self.children[0].as_ref().map_or(0, |c| c.value.parity),
            self.children[1].as_ref().map_or(0, |c| c.value.parity),
        ];
        self.value.sum = [
            value[0][0] + value[1][parity[0]],
            value[0][1] + value[1][1 ^ parity[0]],
        ];
        self.value.parity = parity[0] ^ parity[1];
    }
}

提出情報

提出日時
問題 G - Odd Position Sum Query
ユーザ ngtkana
言語 Rust (rustc 1.70.0)
得点 600
コード長 2248 Byte
結果 AC
実行時間 895 ms
メモリ 200052 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 2
AC × 47
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt, 01_test_32.txt, 01_test_33.txt, 01_test_34.txt, 01_test_35.txt, 01_test_36.txt, 01_test_37.txt, 01_test_38.txt, 01_test_39.txt, 01_test_40.txt, 01_test_41.txt, 01_test_42.txt, 01_test_43.txt, 01_test_44.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 1972 KiB
00_sample_01.txt AC 1 ms 1944 KiB
01_test_00.txt AC 0 ms 2024 KiB
01_test_01.txt AC 0 ms 1944 KiB
01_test_02.txt AC 0 ms 1964 KiB
01_test_03.txt AC 1 ms 2144 KiB
01_test_04.txt AC 1 ms 2224 KiB
01_test_05.txt AC 2 ms 2364 KiB
01_test_06.txt AC 15 ms 7508 KiB
01_test_07.txt AC 4 ms 3528 KiB
01_test_08.txt AC 46 ms 16664 KiB
01_test_09.txt AC 282 ms 71108 KiB
01_test_10.txt AC 538 ms 125680 KiB
01_test_11.txt AC 427 ms 112652 KiB
01_test_12.txt AC 895 ms 190628 KiB
01_test_13.txt AC 794 ms 190508 KiB
01_test_14.txt AC 245 ms 6564 KiB
01_test_15.txt AC 381 ms 10124 KiB
01_test_16.txt AC 273 ms 7396 KiB
01_test_17.txt AC 383 ms 10132 KiB
01_test_18.txt AC 356 ms 9188 KiB
01_test_19.txt AC 388 ms 10136 KiB
01_test_20.txt AC 251 ms 7168 KiB
01_test_21.txt AC 410 ms 10992 KiB
01_test_22.txt AC 408 ms 17136 KiB
01_test_23.txt AC 512 ms 18308 KiB
01_test_24.txt AC 532 ms 69304 KiB
01_test_25.txt AC 661 ms 74604 KiB
01_test_26.txt AC 864 ms 200052 KiB
01_test_27.txt AC 842 ms 199984 KiB
01_test_28.txt AC 823 ms 195376 KiB
01_test_29.txt AC 867 ms 195432 KiB
01_test_30.txt AC 810 ms 198112 KiB
01_test_31.txt AC 889 ms 198060 KiB
01_test_32.txt AC 641 ms 97232 KiB
01_test_33.txt AC 736 ms 96608 KiB
01_test_34.txt AC 576 ms 190548 KiB
01_test_35.txt AC 623 ms 190572 KiB
01_test_36.txt AC 580 ms 190424 KiB
01_test_37.txt AC 619 ms 190616 KiB
01_test_38.txt AC 596 ms 190452 KiB
01_test_39.txt AC 597 ms 190488 KiB
01_test_40.txt AC 599 ms 190384 KiB
01_test_41.txt AC 593 ms 190596 KiB
01_test_42.txt AC 1 ms 2036 KiB
01_test_43.txt AC 378 ms 7500 KiB
01_test_44.txt AC 386 ms 10268 KiB