結果
| 問題 |
No.1496 不思議な数え上げ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-11-26 11:38:28 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 409 ms / 3,000 ms |
| コード長 | 1,309 bytes |
| コンパイル時間 | 13,062 ms |
| コンパイル使用メモリ | 378,188 KB |
| 実行使用メモリ | 15,872 KB |
| 最終ジャッジ日時 | 2024-11-26 11:38:59 |
| 合計ジャッジ時間 | 29,752 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 39 |
ソースコード
use std::collections::BTreeSet;
#[allow(unused_imports)]
use proconio::{
input,
marker::{Bytes, Chars, Usize1},
};
fn main() {
input! {
n: usize,
mut p: [usize; n],
a: [usize; n],
}
p.insert(0, 0);
p.push(0);
let mut q = vec![0; n + 1];
for i in 1..=n {
q[p[i]] = i;
}
let mut csum = vec![0; p.len() + 1];
for i in 0..p.len() {
csum[i + 1] = csum[i] + p[i];
}
let mut st = BTreeSet::from([0, n + 1]);
for i in 1..=n {
let m = q[i];
let mut s = a[i - 1];
let l = *st.range(..m).next_back().unwrap();
let r = *st.range(m..).next().unwrap();
st.insert(m);
let mut res = 0;
if m - l <= r - m {
for &x in p[l + 1..=m].iter().rev() {
if s < x {
break;
}
s -= x;
res += csum[m + 1..=r].partition_point(|&c| c - csum[m + 1] <= s);
}
} else {
for &x in &p[m..r] {
if s < x {
break;
}
s -= x;
let t = (m - l) - csum[l + 1..=m].partition_point(|&c| csum[m] - c > s);
res += t;
}
}
println!("{}", res);
}
}