結果
| 問題 | No.3313 Matryoshka |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-30 00:32:45 |
| 言語 | Rust (1.92.0 + proconio + num + itertools) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,167 bytes |
| 記録 | |
| コンパイル時間 | 16,476 ms |
| コンパイル使用メモリ | 215,048 KB |
| 実行使用メモリ | 52,672 KB |
| 最終ジャッジ日時 | 2026-01-30 00:33:13 |
| 合計ジャッジ時間 | 12,443 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 TLE * 1 -- * 19 |
コンパイルメッセージ
warning: variable `L` should have a snake case name --> src/main.rs:87:17 | 87 | let mut L = self.size + l; | ^ help: convert the identifier to snake case: `l` | = note: `#[warn(non_snake_case)]` (part of `#[warn(nonstandard_style)]`) on by default warning: variable `R` should have a snake case name --> src/main.rs:88:17 | 88 | let mut R = self.size + r; | ^ help: convert the identifier to snake case: `r`
ソースコード
use proconio::input;
struct SegmentTree {
size: usize,
a: Vec<Vec<usize>>,
}
impl SegmentTree {
fn new(n: usize) -> Self {
let mut size = 1usize;
while size < n {
size <<= 1;
}
Self {
size,
a: vec![Vec::new(); 2 * size],
}
}
fn set(&mut self, x: usize, j: usize) {
let mut idx = self.size + x;
self.a[idx].push(j);
while idx > 1 {
idx >>= 1;
let left = idx << 1;
let right = left | 1;
// --- 借用衝突回避のため clone ---
let left_vec = self.a[left].clone();
let right_vec = self.a[right].clone();
let dst = &mut self.a[idx];
Self::merge(dst, &left_vec, &right_vec);
}
}
fn merge(dst: &mut Vec<usize>, left: &Vec<usize>, right: &Vec<usize>) {
dst.clear();
dst.reserve(left.len() + right.len());
let mut i = 0usize;
let mut j = 0usize;
while i < left.len() || j < right.len() {
if i < left.len() && j < right.len() {
if left[i] <= right[j] {
dst.push(left[i]);
i += 1;
} else {
dst.push(right[j]);
j += 1;
}
} else if i < left.len() {
dst.push(left[i]);
i += 1;
} else {
dst.push(right[j]);
j += 1;
}
}
}
// Python の _calc と等価
fn calc(array: &Vec<usize>, x: usize) -> usize {
if array.is_empty() {
return 0;
}
if x <= array[0] {
return array.len();
}
// lower_bound
let mut lo = 0usize;
let mut hi = array.len();
while lo < hi {
let mid = (lo + hi) / 2;
if array[mid] < x {
lo = mid + 1;
} else {
hi = mid;
}
}
array.len() - lo
}
fn get_sum(&self, l: usize, r: usize, x: usize) -> usize {
let mut L = self.size + l;
let mut R = self.size + r;
let mut res = 0usize;
while L < R {
if (R & 1) == 1 {
R -= 1;
res += Self::calc(&self.a[R], x);
}
if (L & 1) == 1 {
res += Self::calc(&self.a[L], x);
L += 1;
}
L >>= 1;
R >>= 1;
}
res
}
}
fn main() {
input! {
n: usize,
lr_in: [(usize, usize); n],
}
let mut max_r = 0usize;
let mut lr: Vec<(usize, usize, usize)> = Vec::with_capacity(n);
for (i, (l, r)) in lr_in.into_iter().enumerate() {
max_r = max_r.max(r);
lr.push((l, r, i));
}
// l の降順(Python の reverse=True)
lr.sort_by(|a, b| b.0.cmp(&a.0));
let mut seg = SegmentTree::new(max_r + 1);
let mut ans: i64 = 0;
for (l, r, idx) in lr {
ans += seg.get_sum(l, r, idx) as i64;
seg.set(r, idx);
}
println!("{}", ans);
}