結果
| 問題 | No.3265 地元に帰れば天才扱い! |
| コンテスト | |
| ユーザー |
lp_ql
|
| 提出日時 | 2025-09-06 15:07:12 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,729 bytes |
| 記録 | |
| コンパイル時間 | 21,304 ms |
| コンパイル使用メモリ | 376,792 KB |
| 実行使用メモリ | 61,144 KB |
| 最終ジャッジ日時 | 2025-09-06 15:08:47 |
| 合計ジャッジ時間 | 52,777 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | TLE * 21 |
コンパイルメッセージ
warning: method `update` is never used
--> src/main.rs:78:8
|
67 | impl<M: Monoid> DynamicSegtree<M> {
| --------------------------------- method in this implementation
...
78 | fn update(&mut self, idx: usize, val: M::S) {
| ^^^^^^
|
= note: `#[warn(dead_code)]` on by default
ソースコード
use proconio::{input, marker::Usize1};
fn main() {
input!{
n: usize,
m: usize,
mut alr: [(i64, Usize1, Usize1); n],
q: usize,
xyuv: [(Usize1, Usize1, Usize1, Usize1); q],
}
let mut seg = DynamicSegtree::<M>::new(0, m + 2);
let mut seg2 = DynamicSegtree::<M>::new(0, m + 2);
let mut ans: i64 = 0;
for i in 0..n{
seg2.set(i, alr[i].0);
seg.set(alr[i].1, seg.prod(alr[i].1, alr[i].1 + 1) + 1);
seg.set(alr[i].2 + 1, seg.prod(alr[i].2 + 1, alr[i].2 + 2) - 1);
ans += alr[i].0 * (alr[i].2 - alr[i].1 + 1) as i64
}
for i in 0..n{
ans -= seg.prod(0, i + 1) * alr[i].0;
}
let mut idx = (0..n).collect::<Vec<usize>>();
for (x, y, u, v) in xyuv{
ans += seg.prod(0, idx[x] + 1) * alr[x].0;
seg.set(alr[x].1, seg.prod(alr[x].1, alr[x].1 + 1) - 1);
seg.set(alr[x].2 + 1, seg.prod(alr[x].2 + 1, alr[x].2 + 2) + 1);
seg2.set(idx[x], 0);
ans += seg2.prod(alr[x].1, alr[x].2 + 1);
ans -= alr[x].0 * (alr[x].2 - alr[x].1 + 1) as i64;
idx[x] = y;
(alr[x].1, alr[x].2) = (u, v);
ans += alr[x].0 * (alr[x].2 - alr[x].1 + 1) as i64;
ans -= seg2.prod(alr[x].1, alr[x].2 + 1);
seg2.set(idx[x], alr[x].0);
seg.set(alr[x].1, seg.prod(alr[x].1, alr[x].1 + 1) + 1);
seg.set(alr[x].2 + 1, seg.prod(alr[x].2 + 1, alr[x].2 + 2) - 1);
ans -= seg.prod(0, idx[x] + 1) * alr[x].0;
println!("{}", ans);
}
}
struct M;
impl Monoid for M {
type S = i64;
fn identity() -> Self::S {
0
}
fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S {
a + b
}
}
trait Monoid {
type S: Clone;
fn identity() -> Self::S;
fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S;
}
struct DynamicSegtree<M: Monoid> {
l: usize,
r: usize,
value: M::S,
left: Option<Box<DynamicSegtree<M>>>,
right: Option<Box<DynamicSegtree<M>>>,
}
impl<M: Monoid> DynamicSegtree<M> {
fn new(l: usize, r: usize) -> Self {
Self {
l,
r,
value: M::identity(),
left: None,
right: None,
}
}
fn update(&mut self, idx: usize, val: M::S) {
if idx < self.l || idx >= self.r {
return;
}
if self.r - self.l == 1 {
self.value = M::binary_operation(&self.value.clone(), &val);
return;
}
let mid = (self.l + self.r) / 2;
if idx < mid {
if self.left.is_none() {
self.left = Some(Box::new(DynamicSegtree::<M>::new(self.l, mid)));
}
self.left.as_mut().unwrap().update(idx, val.clone());
} else {
if self.right.is_none() {
self.right = Some(Box::new(DynamicSegtree::<M>::new(mid, self.r)));
}
self.right.as_mut().unwrap().update(idx, val.clone());
}
let left_val = self.left.as_ref().map(|node| node.value.clone()).unwrap_or(M::identity());
let right_val = self.right.as_ref().map(|node| node.value.clone()).unwrap_or(M::identity());
self.value = M::binary_operation(&left_val, &right_val);
}
fn set(&mut self, idx: usize, val: M::S) {
if idx < self.l || idx >= self.r {
return;
}
if self.r - self.l == 1 {
self.value = val;
return;
}
let mid = (self.l + self.r) / 2;
if idx < mid {
if self.left.is_none() {
self.left = Some(Box::new(DynamicSegtree::<M>::new(self.l, mid)));
}
self.left.as_mut().unwrap().set(idx, val.clone());
} else {
if self.right.is_none() {
self.right = Some(Box::new(DynamicSegtree::<M>::new(mid, self.r)));
}
self.right.as_mut().unwrap().set(idx, val.clone());
}
let left_val = self.left.as_ref().map(|node| node.value.clone()).unwrap_or(M::identity());
let right_val = self.right.as_ref().map(|node| node.value.clone()).unwrap_or(M::identity());
self.value = M::binary_operation(&left_val, &right_val);
}
fn prod(&self, ql: usize, qr: usize) -> M::S {
if self.r <= ql || qr <= self.l {
return M::identity();
}
if ql <= self.l && self.r <= qr {
return self.value.clone();
}
let left_res = self.left.as_ref().map(|node| node.prod(ql, qr)).unwrap_or(M::identity());
let right_res = self.right.as_ref().map(|node| node.prod(ql, qr)).unwrap_or(M::identity());
M::binary_operation(&left_res, &right_res)
}
}
lp_ql