提出 #65933685
ソースコード 拡げる
#![allow(unused)]
fn main() {
let n = read::<usize>();
let mut adj = vec![vec![]; n];
let mut edges = vec![(0, 0); n - 1];
for eid in 0..(n - 1) {
let uv = readv::<usize>();
let (u, v) = (uv[0] - 1, uv[1] - 1);
adj[u].push(v);
adj[v].push(u);
edges[eid] = (u, v);
}
let (enter, leave) = euler_tour(&adj, 0);
let mut bit = BIT::<i64>::new(n);
for u in 0..n {
bit.add(enter[u], 1);
}
let q = read::<usize>();
let mut ans = vec![];
for _ in 0..q {
let ask = readv::<i64>();
if ask[0] == 1 {
let (x, w) = (ask[1] as usize - 1, ask[2]);
bit.add(enter[x], w);
} else {
let eid = ask[1] as usize - 1;
let (mut u, mut v) = edges[eid];
if enter[u] > enter[v] {
(u, v) = (v, u);
}
let sum1 = bit.sum(enter[v], leave[v]);
let sum2 = bit.sum(0, n) - sum1;
ans.push(sum1.abs_diff(sum2));
}
}
println!("{}", join(&ans, "\n"));
}
// subtree of u <-> range enter[u]..leave[u]
fn euler_tour(adj: &Vec<Vec<usize>>, root: usize) -> (Vec<usize>, Vec<usize>) {
let n = adj.len();
let mut t = 0;
let mut enter = vec![!0; n]; // enter time
let mut leave = vec![!0; n]; // leave time
euler_dfs(root, !0, &mut t, &mut enter, &mut leave, adj);
(enter, leave)
}
fn euler_dfs(
u: usize,
p: usize,
t: &mut usize,
enter: &mut Vec<usize>,
leave: &mut Vec<usize>,
adj: &Vec<Vec<usize>>,
) {
enter[u] = *t;
*t += 1;
for &v in &adj[u] {
if v != p {
euler_dfs(v, u, t, enter, leave, adj);
}
}
leave[u] = *t;
}
struct BIT<T> {
dat: Vec<T>,
}
impl<T: Clone + Default + std::ops::AddAssign + std::ops::Sub<Output = T>> BIT<T> {
fn new(n: usize) -> Self {
Self {
dat: vec![T::default(); n + 1],
}
}
// 0-based
fn add(&mut self, mut i: usize, x: T) {
i += 1; // convert to 1-based
while i < self.dat.len() {
self.dat[i] += x.clone();
i += i & (!i + 1); // i & (-i)
}
}
// 0..=i, 0-based
fn pref(&self, mut i: usize) -> T {
let mut res = T::default();
i += 1; // convert to 1-based
while i > 0 {
res += self.dat[i].clone();
i -= i & (!i + 1);
}
res
}
// l..i, 0-based
fn sum(&self, mut l: usize, mut r: usize) -> T {
if r == 0 {
T::default()
} else if l >= 1 {
self.pref(r - 1) - self.pref(l - 1)
} else {
self.pref(r - 1)
}
}
}
fn read<T: std::str::FromStr>() -> T {
let mut s = String::new();
std::io::stdin().read_line(&mut s);
s.trim().parse().ok().unwrap()
}
fn readv<T: std::str::FromStr>() -> Vec<T> {
read::<String>()
.split_ascii_whitespace()
.map(|t| t.parse().ok().unwrap())
.collect()
}
fn reads() -> Vec<char> {
read::<String>().chars().collect()
}
fn mapv<T, S, F: Fn(&T) -> S>(arr: &Vec<T>, f: F) -> Vec<S> {
arr.iter().map(f).collect()
}
fn join<T: ToString>(arr: &[T], sep: &str) -> String {
arr.iter()
.map(|x| x.to_string())
.collect::<Vec<String>>()
.join(sep)
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
500 / 500 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
example_00.txt |
| All |
example_00.txt, hand_00.txt, hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, hand_06.txt, hand_07.txt, hand_08.txt, hand_09.txt, hand_10.txt, hand_11.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| example_00.txt |
AC |
1 ms |
1872 KiB |
| hand_00.txt |
AC |
187 ms |
68516 KiB |
| hand_01.txt |
AC |
156 ms |
47640 KiB |
| hand_02.txt |
AC |
206 ms |
46052 KiB |
| hand_03.txt |
AC |
132 ms |
35212 KiB |
| hand_04.txt |
AC |
209 ms |
56040 KiB |
| hand_05.txt |
AC |
219 ms |
56048 KiB |
| hand_06.txt |
AC |
1 ms |
1868 KiB |
| hand_07.txt |
AC |
214 ms |
53180 KiB |
| hand_08.txt |
AC |
208 ms |
45448 KiB |
| hand_09.txt |
AC |
204 ms |
45412 KiB |
| hand_10.txt |
AC |
152 ms |
46712 KiB |
| hand_11.txt |
AC |
151 ms |
48128 KiB |
| random_00.txt |
AC |
159 ms |
49468 KiB |
| random_01.txt |
AC |
169 ms |
49284 KiB |
| random_02.txt |
AC |
187 ms |
49404 KiB |
| random_03.txt |
AC |
216 ms |
49400 KiB |
| random_04.txt |
AC |
167 ms |
49436 KiB |
| random_05.txt |
AC |
142 ms |
47748 KiB |
| random_06.txt |
AC |
141 ms |
47644 KiB |
| random_07.txt |
AC |
179 ms |
47504 KiB |
| random_08.txt |
AC |
176 ms |
47564 KiB |
| random_09.txt |
AC |
180 ms |
47824 KiB |
| random_10.txt |
AC |
159 ms |
46020 KiB |
| random_11.txt |
AC |
182 ms |
46012 KiB |
| random_12.txt |
AC |
203 ms |
46016 KiB |
| random_13.txt |
AC |
209 ms |
46064 KiB |
| random_14.txt |
AC |
173 ms |
46028 KiB |
| random_15.txt |
AC |
165 ms |
46024 KiB |
| random_16.txt |
AC |
161 ms |
45888 KiB |
| random_17.txt |
AC |
174 ms |
45952 KiB |
| random_18.txt |
AC |
180 ms |
45912 KiB |
| random_19.txt |
AC |
214 ms |
46056 KiB |
| random_20.txt |
AC |
205 ms |
45972 KiB |
| random_21.txt |
AC |
190 ms |
45964 KiB |
| random_22.txt |
AC |
162 ms |
45960 KiB |
| random_23.txt |
AC |
197 ms |
46116 KiB |
| random_24.txt |
AC |
214 ms |
46048 KiB |
| random_25.txt |
AC |
209 ms |
45912 KiB |
| random_26.txt |
AC |
209 ms |
46116 KiB |
| random_27.txt |
AC |
197 ms |
45960 KiB |
| random_28.txt |
AC |
164 ms |
46124 KiB |
| random_29.txt |
AC |
158 ms |
46056 KiB |