結果
| 問題 | No.3389 k-Days Later |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-28 23:09:51 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 278 ms / 2,000 ms |
| コード長 | 1,410 bytes |
| コンパイル時間 | 16,209 ms |
| コンパイル使用メモリ | 396,636 KB |
| 実行使用メモリ | 11,324 KB |
| 最終ジャッジ日時 | 2025-11-28 23:10:20 |
| 合計ジャッジ時間 | 27,347 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 28 |
コンパイルメッセージ
warning: value assigned to `k` is never read --> src/main.rs:46:5 | 46 | k -= ans_d; | ^ | = help: maybe it is overwritten before being read? = note: `#[warn(unused_assignments)]` on by default
ソースコード
use proconio::input;
fn main() {
input! {
n: usize,
d: [u128; n],
}
// dの累積和を計算
let mut acc_d = vec![0; n+1];
for i in 0..n {
acc_d[i+1] = acc_d[i] + d[i];
}
input! {
q: usize,
}
for _ in 0..q {
solve(n, &&acc_d);
}
}
fn solve(n: usize, acc_d: &Vec<u128>) {
input! {
y: u128, m: u128, d: u128,
mut k: u128,
}
// 年月日を日数に換算
let add_d = (y-1) * acc_d[n] + acc_d[(m-1) as usize] + d-1;
// 日数を加算
k += add_d;
// 年
let ans_y = k / acc_d[n];
k -= ans_y * acc_d[n];
// 月
let ans_m = below_bound(acc_d, k);
k -= acc_d[ans_m];
// 日
let ans_d = k;
k -= ans_d;
println!("{} {} {}", ans_y+1, ans_m+1, ans_d+1);
}
const INFS: usize = 1 << 60;
// 二分探索
// val以下の最大のposを返す。0番目より小さい値では異常値として、「1<<60」を返す
pub fn below_bound<T: std::cmp::PartialOrd>(vec: &Vec<T>, val: T) -> usize {
let mut l = 0;
let mut r = vec.len();
while r - l > 0 {
let m = (l + r) / 2;
if vec[m] <= val {
l = m + 1;
} else {
r = m;
}
}
if l == 0 { INFS } else {l-1}
}
/*
5
1 1 1 1 1
1
1 1 1 5
1 1 1 26
5
1 1 2 1
1 2 1 2
1 1 1 25
23 5 7 8
271828182845904523 5 3 602874713526624977
*/