結果

問題 No.702 中央値を求めよ LIMITED
ユーザー LyricalMaestroLyricalMaestro
提出日時 2024-09-08 14:05:51
言語 Rust
(1.77.0 + proconio)
結果
WA  
実行時間 -
コード長 1,460 bytes
コンパイル時間 12,502 ms
コンパイル使用メモリ 382,548 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-09-08 14:06:30
合計ジャッジ時間 26,147 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 437 ms
6,812 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 AC 436 ms
6,940 KB
testcase_05 AC 436 ms
6,944 KB
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 AC 437 ms
6,940 KB
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 AC 463 ms
6,940 KB
testcase_18 WA -
testcase_19 AC 451 ms
6,940 KB
testcase_20 WA -
testcase_21 AC 436 ms
6,940 KB
testcase_22 AC 463 ms
6,940 KB
testcase_23 AC 436 ms
6,940 KB
testcase_24 AC 438 ms
6,944 KB
testcase_25 WA -
testcase_26 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

const MAX: u32 = u32::MAX;

struct Generator {
    x: u32,
    y: u32,
    z: u32,
    w: u32,
}

impl Generator {
    fn new(seed: u32) -> Generator {
        Generator {
            x: seed,
            y: 1,
            z: 2,
            w: 3,
        }
    }

    fn generate(&mut self) -> u32 {
        let t = (self.x ^ (self.x << 11)) & MAX;
        self.x = self.y;
        self.y = self.z;
        self.z = self.w;
        self.w = ((self.w ^ (self.w >> 19)) ^ (t ^ (t >> 8))) & MAX;
        self.w
    }
}

fn solve(n: u32, seed: u32, value: u32) -> bool {
    let mut generator = Generator::new(seed);

    let n2 = n / 2;
    let n1 = n2 + 1;

    let mut cnt = 0;
    for _ in 0..n {
        let x = generator.generate();
        if x >= value {
            cnt += 1;
        }
    }
    cnt >= n1
}

fn main() {
    use std::io;

    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read input");
    let seed: u32 = input.trim().parse().expect("Input is not a valid u32");

    let n: u32 = 10_000_001;

    let mut low: u32 = 1 << 2 - 1;
    let mut high: u32 = 0;
    for i in 0..31 {
        high += 1 << i;
    }

    while high - low > 1 {
        let mid = (high + low) >> 1;
        if solve(n, seed, mid) {
            low = mid;
        } else {
            high = mid;
        }
    }

    if solve(n, seed, high) {
        println!("{}", high);
    } else {
        println!("{}", low);
    }
}
0