結果
| 問題 | No.2395 区間二次変換一点取得 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-06-27 10:34:14 |
| 言語 | Rust (1.94.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 29 ms / 2,000 ms |
| コード長 | 2,488 bytes |
| 記録 | |
| コンパイル時間 | 1,252 ms |
| コンパイル使用メモリ | 193,184 KB |
| 実行使用メモリ | 9,460 KB |
| 最終ジャッジ日時 | 2026-06-27 10:34:26 |
| 合計ジャッジ時間 | 4,526 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
ソースコード
/*
* Author: srtry
* Created: 2026-06-26T23:33:33+09:00
* Coding: utf-8-unix
*/
use proconio::input;
use std::io::{stdout,Write,BufWriter};
const MAX_N:usize = 100001;
#[inline(always)]
fn add_bit_imos(bit_imos:&mut [isize;MAX_N], size:usize, idx:usize, x:isize) {
let mut i = idx;
while i <= size {
bit_imos[i] += x;
i += i & (!i + 1);
}
}
#[inline(always)]
fn sum_bit_imos(bit_imos:&[isize;MAX_N], idx:usize) -> usize {
let mut i = idx;
let mut s = 0;
while i > 0 {
s += bit_imos[i];
i -= i & (!i + 1);
}
s as usize
}
#[inline(always)]
fn push_usize_to_string(s: &mut String, mut num: usize) {
if num == 0 {
// push_zero_to_string(s);
s.push('0');
return;
}
// String の皮をひんむいて、中身の Vec<u8> を直接操作する(超高速)
// ※ 整数を文字(ASCII)にするだけなので安全です
let buf = unsafe { s.as_mut_vec() };
let start_idx = buf.len();
// 💡 これがやりたかった「純粋な計算式」!
// 10で割った余りに '0' のバイト値(48)を足すと、その数字の文字コードになります
while num > 0 {
buf.push(b'0' + (num % 10) as u8);
num /= 10;
}
// 逆順に入っているので、この数値の分だけ反転する
buf[start_idx..].reverse();
}
fn main() {
input!{
n:usize, b:usize, q:usize,
queries: [(usize,usize,usize);q]
}
let out = stdout();
let mut out = BufWriter::with_capacity(8*2100000,out.lock());
let mut ans:String = String::with_capacity(8*2100000);
let mut bit_imos:[isize;MAX_N] = [0;MAX_N];
// xにi回加算された時のy,z
let mut mem:[(usize,usize);MAX_N] = [(1,1);MAX_N];
for i in 1..=q {
mem[i].1 = (3*mem[i-1].1) % b; // z_k
mem[i].0 = (3*mem[i-1].0 % b) + (2*(i+1)*mem[i-1].1 % b); // y_k
mem[i].0 %= b;
}
for (l,m,r) in queries {
add_bit_imos(&mut bit_imos, n, l, 1);
add_bit_imos(&mut bit_imos, n, r+1, -1);
let k:usize= sum_bit_imos(&bit_imos, m);
let x:usize = (1 + k) % b;
push_usize_to_string(&mut ans, x);
ans.push(' ');
push_usize_to_string(&mut ans, mem[k].0);
ans.push(' ');
push_usize_to_string(&mut ans, mem[k].1);
ans.push('\n');
}
out.write_all(ans.as_bytes()).unwrap();
out.flush().unwrap();
}