結果
問題 |
No.3265 地元に帰れば天才扱い!
|
ユーザー |
![]() |
提出日時 | 2025-09-07 03:00:51 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 385 ms / 2,500 ms |
コード長 | 3,462 bytes |
コンパイル時間 | 13,604 ms |
コンパイル使用メモリ | 397,304 KB |
実行使用メモリ | 25,728 KB |
最終ジャッジ日時 | 2025-09-07 03:01:18 |
合計ジャッジ時間 | 25,783 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 21 |
コンパイルメッセージ
warning: unused variable: `p` --> src/main.rs:110:11 | 110 | for &(p, a, l, r) in &iwis { | ^ help: if this is intentional, prefix it with an underscore: `_p` | = note: `#[warn(unused_variables)]` on by default
ソースコード
use std::io::{self, Read}; struct FenwickTree { n: usize, data: Vec<i64>, } impl FenwickTree { fn new(n: usize) -> Self { let n2 = n + 10; Self { n: n2, data: vec![0; n2 + 1], } } fn add(&mut self, mut p: usize, x: i64) { debug_assert!(p < self.n); p += 1; while p < self.data.len() { self.data[p] += x; p += p & (!p + 1); // p += p & -p } } fn sum(&self, mut p: usize) -> i64 { debug_assert!(p < self.n); p += 1; let mut s = 0; while p > 0 { s += self.data[p]; p &= p - 1; // p -= p & -p } s } fn rangesum(&self, l: usize, r: usize) -> i64 { debug_assert!(l <= r && r < self.n); let mut s = self.sum(r); if l > 0 { s -= self.sum(l - 1); } s } } struct RAQ { a: FenwickTree, b: FenwickTree, n: usize, } impl RAQ { fn new(n: usize) -> Self { Self { a: FenwickTree::new(n + 10), b: FenwickTree::new(n + 10), n, } } fn add(&mut self, mut l: usize, mut r: usize, x: i64) { debug_assert!(l <= r && r < self.n); l += 1; r += 1; self.a.add(l, -x * (l as i64 - 1)); self.b.add(l, x); self.a.add(r + 1, x * r as i64); self.b.add(r + 1, -x); } fn sum(&self, mut l: usize, mut r: usize) -> i64 { debug_assert!(l <= r && r < self.n); l += 1; r += 1; let res = self.a.sum(r) + self.b.sum(r) * r as i64 - (self.a.sum(l - 1) + self.b.sum(l - 1) * (l as i64 - 1)); res } fn get(&self, p: usize) -> i64 { self.sum(p, p) } } fn main() { // 入力全読み let mut input = String::new(); io::stdin().read_to_string(&mut input).unwrap(); let mut iter = input.split_whitespace().map(|x| x.parse::<i64>().unwrap()); let n = iter.next().unwrap() as usize; let m = iter.next().unwrap() as usize; let mut ft = FenwickTree::new(m); let mut raq = RAQ::new(m); let mut iwis: Vec<(usize, i64, usize, usize)> = Vec::new(); for i in 0..n { let a = iter.next().unwrap(); let l = iter.next().unwrap() as usize - 1; let r = iter.next().unwrap() as usize - 1; iwis.push((i, a, l, r)); ft.add(i, a); raq.add(l, r, 1); } let mut tot: i64 = 0; for &(p, a, l, r) in &iwis { tot += a * (r as i64 - l as i64 + 1) - ft.rangesum(l, r); } let q = iter.next().unwrap() as usize; let mut output = String::new(); for _ in 0..q { let x = iter.next().unwrap() as usize - 1; let y = iter.next().unwrap() as usize - 1; let u = iter.next().unwrap() as usize - 1; let v = iter.next().unwrap() as usize - 1; let mut ntot = tot; // 人 X を削除 let (p, a, l, r) = iwis[x]; ntot -= a * (r as i64 - l as i64 + 1) - ft.rangesum(l, r); raq.add(l, r, -1); ntot += raq.get(p) * a; ft.add(p, -a); // 人 X を追加 ft.add(y, a); iwis[x] = (y, a, u, v); ntot += a * (v as i64 - u as i64 + 1) - ft.rangesum(u, v); ntot -= raq.get(y) * a; raq.add(u, v, 1); output.push_str(&format!("{}\n", ntot)); tot = ntot; } print!("{}", output); }