結果
| 問題 |
No.702 中央値を求めよ LIMITED
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-06-15 23:56:00 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,988 bytes |
| コンパイル時間 | 12,187 ms |
| コンパイル使用メモリ | 400,288 KB |
| 実行使用メモリ | 43,068 KB |
| 最終ジャッジ日時 | 2024-06-30 15:39:36 |
| 合計ジャッジ時間 | 17,781 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | MLE * 2 |
| other | MLE * 25 |
ソースコード
use std::io::*;
use std::str::FromStr;
use utils::*;
pub fn main() {
let i = stdin();
let mut o = Vec::new();
run(i.lock(), &mut o);
stdout().write_all(&o).unwrap();
}
fn run<R: BufRead, W: Write>(i: R, o: &mut W) {
let mut i = CpReader::new(i);
let seed = i.read::<u32>();
writeln!(o, "{}", solve(seed)).unwrap();
}
struct Gen {
x: u32,
y: u32,
z: u32,
w: u32,
}
impl Gen {
fn new(seed: u32) -> Self {
Gen {
x: seed,
y: 1,
z: 2,
w: 3,
}
}
fn next(&mut self) -> u32 {
let t = self.x ^ (self.x << 11);
self.x = self.y;
self.y = self.z;
self.z = self.w;
self.w = (self.w ^ (self.w >> 19)) ^ (t ^ (t >> 8));
return self.w;
}
}
fn solve(seed: u32) -> u32 {
let mut ns = Vec::new();
let mut g = Gen::new(seed);
for _ in 0..10000001 + 1 {
ns.push(g.next());
}
fn is_over_mid(ns: &[u32], mid: u32) -> bool {
let mut c = 0;
for &n in ns {
if n <= mid {
c += 1;
}
}
c >= 5000001
}
let mut low = 0;
let mut high = u32::max_value();
while low < high {
let mid = ((low as u64 + high as u64) / 2) as u32;
if is_over_mid(&ns, mid) {
high = mid;
} else {
low = mid + 1;
}
}
low
}
mod utils {
use super::*;
pub struct CpReader<R: BufRead> {
r: R,
s: String,
}
impl<R: BufRead> CpReader<R> {
pub fn new(r: R) -> Self {
CpReader {
r: r,
s: String::new(),
}
}
pub fn read_line(&mut self) -> &str {
self.s.clear();
self.r.read_line(&mut self.s).unwrap();
self.s.trim()
}
pub fn read<T: FromStr>(&mut self) -> T {
self.read_line().parse().ok().unwrap()
}
}
}