結果
問題 | No.1715 Dinner 2 |
ユーザー |
![]() |
提出日時 | 2021-10-23 11:21:06 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 445 ms / 2,000 ms |
コード長 | 2,672 bytes |
コンパイル時間 | 13,293 ms |
コンパイル使用メモリ | 389,292 KB |
実行使用メモリ | 9,800 KB |
最終ジャッジ日時 | 2024-09-25 02:31:21 |
合計ジャッジ時間 | 18,335 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 38 |
コンパイルメッセージ
warning: unused variable: `i` --> src/main.rs:23:9 | 23 | for i in 0..n { | ^ help: if this is intentional, prefix it with an underscore: `_i` | = note: `#[warn(unused_variables)]` on by default warning: unused variable: `ng` --> src/main.rs:64:14 | 64 | let (ok, ng) = binary_search(-(d as i64) * 100000000 - 1, 0, criterion); | ^^ help: if this is intentional, prefix it with an underscore: `_ng`
ソースコード
#![allow(unused_imports)]use std::cmp::*;use std::collections::*;use std::io::Write;use std::ops::Bound::*;#[allow(unused_macros)]macro_rules! debug {($($e:expr),*) => {#[cfg(debug_assertions)]$({let (e, mut err) = (stringify!($e), std::io::stderr());writeln!(err, "{} = {:?}", e, $e).unwrap()})*};}fn main() {let v = read_vec::<usize>();let (n, d) = (v[0], v[1]);let mut negs = vec![];for i in 0..n {let v = read_vec::<i64>();let (p, q) = (v[0], v[1]);negs.push((p, q));}let criterion = |mid: i64| -> bool {let mut dp = vec![vec![-std::i64::MAX / 4; n]; d];for (i, &(p, q)) in negs.iter().enumerate() {if -p >= mid {dp[0][i] = q - p;}}for di in 1..d {let mut from_left = vec![0; n];from_left[0] = dp[di - 1][0];for i in 1..n {from_left[i] = max(from_left[i - 1], dp[di - 1][i]);}let mut from_right = vec![0; n];from_right[n - 1] = dp[di - 1][n - 1];for i in (0..n - 1).rev() {from_right[i] = max(from_right[i + 1], dp[di - 1][i]);}for (i, &(p, q)) in negs.iter().enumerate() {let mut cand_from = -std::i64::MAX / 4;if i > 0 {cand_from = from_left[i - 1];}if i < n - 1 {cand_from = max(from_right[i + 1], cand_from);}if cand_from != -std::i64::MAX / 4 && cand_from - p >= mid {dp[di][i] = cand_from + q - p;}}}*dp[d - 1].iter().max().unwrap() >= mid};let (ok, ng) = binary_search(-(d as i64) * 100000000 - 1, 0, criterion);println!("{}", ok);}type Input = i64;fn binary_search<F>(lb: Input, ub: Input, criterion: F) -> (Input, Input)whereF: Fn(Input) -> bool,{assert_eq!(criterion(lb), true);assert_eq!(criterion(ub), false);let mut ok = lb;let mut ng = ub;while ng - ok > 1 {let mid = (ng + ok) / 2;if criterion(mid) {ok = mid;} else {ng = mid;}}(ok, ng)}fn read<T: std::str::FromStr>() -> T {let mut s = String::new();std::io::stdin().read_line(&mut s).ok();s.trim().parse().ok().unwrap()}fn read_vec<T: std::str::FromStr>() -> Vec<T> {read::<String>().split_whitespace().map(|e| e.parse().ok().unwrap()).collect()}