結果
| 問題 |
No.3244 Range Multiple of 8 Query
|
| コンテスト | |
| ユーザー |
urectanc
|
| 提出日時 | 2025-08-22 22:35:25 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,829 bytes |
| コンパイル時間 | 14,172 ms |
| コンパイル使用メモリ | 397,468 KB |
| 実行使用メモリ | 13,276 KB |
| 最終ジャッジ日時 | 2025-08-22 22:36:30 |
| 合計ジャッジ時間 | 60,208 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 19 WA * 21 |
ソースコード
use proconio::{
input,
marker::{Bytes, Usize1},
};
use std::io::Write;
fn main() {
input! {
_n: usize, q: usize,
s: Bytes,
queries: [(Usize1, usize); q]
}
let mut by_digit = vec![vec![]; 10];
for (i, &d) in s.iter().enumerate() {
let d = (d - b'0') as usize;
by_digit[d].push(i);
}
let mul8 = (0..1000)
.step_by(8)
.map(|mut x| {
let a = x % 10;
x /= 10;
let b = x % 10;
x /= 10;
let c = x % 10;
(c, b, a)
})
.collect::<Vec<_>>();
let mut right = [0; 10];
let mut writer = std::io::BufWriter::new(std::io::stdout().lock());
for &(l, r) in &queries {
let mut ans = usize::MAX;
for &(c, b, a) in &mul8 {
right.fill(r);
let Some(i) = find_rightmost(&by_digit[a], right[a]) else {
continue;
};
if i < l {
continue;
}
right[a] = i;
let Some(j) = find_rightmost(&by_digit[b], right[b]) else {
continue;
};
if j < l {
continue;
}
right[b] = j;
let Some(k) = find_rightmost(&by_digit[c], right[c]) else {
continue;
};
if k < l {
continue;
}
let mut cand = 3 * r - 6 - i - j - k;
cand += (i < j) as usize + (j < k) as usize + (i < k) as usize;
ans = ans.min(cand);
}
writeln!(writer, "{}", ans as isize).unwrap();
}
}
fn find_rightmost(v: &[usize], r: usize) -> Option<usize> {
let i = v.partition_point(|&x| x < r);
if i == 0 {
None
} else {
Some(v[i - 1])
}
}
urectanc