結果
| 問題 |
No.952 危険な火薬庫
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2019-12-15 07:32:48 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,245 bytes |
| コンパイル時間 | 19,192 ms |
| コンパイル使用メモリ | 378,508 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-28 17:08:12 |
| 合計ジャッジ時間 | 16,423 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | RE * 3 |
| other | WA * 11 RE * 12 |
ソースコード
use std::io::Read;
use std::io::Write;
fn run() {
let out = std::io::stdout();
let mut out = std::io::BufWriter::new(out.lock());
let mut s = String::new();
std::io::stdin().read_to_string(&mut s).unwrap();
let mut it = s.trim().split_whitespace();
let n: usize = it.next().unwrap().parse().unwrap();
let mut s: Vec<i64> = (0..n).map(|_| it.next().unwrap().parse().unwrap()).collect();
s.push(0);
s.reverse();
s.push(0);
for i in 1..=(n + 1) {
s[i] += s[i - 1];
}
let mut ans = vec![0; n + 1];
let mut dp = vec![3000 * 3000 * 100_000i64 + 1; n + 2];
let mut next = dp.clone();
let mut deq = std::collections::VecDeque::<(i64, i64)>::new();
dp[0] = 0;
for k in 1..=n {
deq.clear();
deq.push_back((-2 * s[k - 1], dp[k - 1] + s[k - 1] * s[k - 1]));
for i in k..=(n + 1) {
let x = s[i - 1];
while deq.len() > 1 {
let (a, b) = *deq.get(0).unwrap();
let (c, d) = *deq.get(1).unwrap();
if a * x + b >= c * x + d {
deq.pop_front();
} else {
break;
}
}
let (a, b) = *deq.front().unwrap();
next[i] = a * x + b + x * x;
let (a, b) = (-2 * s[i], dp[i] + s[i] * s[i]);
while deq.len() > 1 {
let len = deq.len();
let (c, d) = *deq.get(len - 1).unwrap();
let (e, f) = *deq.get(len - 2).unwrap();
let p = (b - d) / (c - a);
let q = (b - f) / (e - a);
let pop = if p < q {
true
} else if p == q && (b - d - p * (c - a)) * (e - q) <= (b - f - q * (e - a)) * (c - a) {
true
} else {
false
};
if pop {
deq.pop_back();
} else {
break;
}
}
deq.push_back((a, b));
}
dp.clone_from(&next);
ans[n + 1 - k] = dp[n + 1];
}
for i in 1..=n {
writeln!(out, "{}", ans[i]).ok();
}
}
fn main() {
run();
}
akakimidori