提出 #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)
}

提出情報

提出日時
問題 F - Compare Tree Weights
ユーザ amoshuangyc
言語 Rust (rustc 1.70.0)
得点 500
コード長 3488 Byte
結果 AC
実行時間 219 ms
メモリ 68516 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 500 / 500
結果
AC × 1
AC × 43
セット名 テストケース
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