提出 #52882061


ソースコード 拡げる

#![allow(unused)]

fn main() {
    let n = read::<usize>();
    let mut arr = readv::<i64>();

    let mut xs = arr.clone();
    xs.sort();
    xs.dedup();

    let mut ans = 0;
    let mut seg = SegTree::<Node>::new(xs.len());
    for i in 0..n {
        let pos = xs.binary_search(&arr[i]).unwrap();

        let (cnt, sum) = seg.get(0, pos, 0, 0, seg.nn);
        ans += arr[i] * cnt - sum;

        let (old_cnt, old_sum) = seg.get(pos, pos + 1, 0, 0, seg.nn);
        seg.set(pos, (old_cnt + 1, old_sum + arr[i]), 0, 0, seg.nn);
    }

    println!("{}", ans);
}

struct Node;
impl SegTrait for Node {
    type S = (i64, i64);
    fn default() -> Self::S {
        (0, 0)
    }
    fn op(a: Self::S, b: Self::S) -> Self::S {
        (a.0 + b.0, a.1 + b.1)
    }
}

trait SegTrait {
    type S: Clone;
    fn default() -> Self::S;
    fn op(a: Self::S, b: Self::S) -> Self::S;
}

struct SegTree<T: SegTrait> {
    nn: usize,
    data: Vec<T::S>,
}

impl<T: SegTrait> SegTree<T> {
    fn new(n: usize) -> Self {
        let nn = n.next_power_of_two();
        let data = vec![T::default(); 2 * nn];
        Self { nn, data }
    }

    fn from_vec(arr: &Vec<T::S>) -> Self {
        let nn = arr.len().next_power_of_two();
        let mut data = vec![T::default(); 2 * nn];
        let s = nn - 1;
        let t = s + arr.len();
        data[s..t].clone_from_slice(arr);
        for u in (0..s).rev() {
            data[u] = T::op(data[2 * u + 1].clone(), data[2 * u + 2].clone());
        }
        Self { nn, data }
    }

    fn get(&mut self, a: usize, b: usize, u: usize, l: usize, r: usize) -> T::S {
        // l..r has no intersection with a..b
        if l >= b || r <= a {
            return T::default();
        }
        // l..r is inside a..b
        if l >= a && r <= b {
            return self.data[u].clone();
        }
        // partially intersect
        let m = (l + r) / 2;
        T::op(
            self.get(a, b, 2 * u + 1, l, m),
            self.get(a, b, 2 * u + 2, m, r),
        )
    }

    fn set(&mut self, i: usize, x: T::S, u: usize, l: usize, r: usize) {
        // l..r has no intersection with i..i+1
        if l >= i + 1 || r <= i {
            return;
        }
        // l..r is inside i..i+1
        if l >= i && r <= i + 1 {
            self.data[u] = x;
            return;
        }
        // partially intersect
        let (m, lch, rch) = ((l + r) / 2, 2 * u + 1, 2 * u + 2);
        self.set(i, x.clone(), lch, l, m);
        self.set(i, x.clone(), rch, m, r);
        self.data[u] = T::op(self.data[lch].clone(), self.data[rch].clone());
    }
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    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::<Vec<char>>()
}

fn mapv<T, S, F: Fn(&T) -> S>(arr: &Vec<T>, f: F) -> Vec<S> {
    arr.iter().map(f).collect()
}

fn join<T: ToString>(v: &[T], sep: &str) -> String {
    v.iter()
        .map(|x| x.to_string())
        .collect::<Vec<String>>()
        .join(sep)
}

提出情報

提出日時
問題 F - Double Sum
ユーザ amoshuangyc
言語 Rust (rustc 1.70.0)
得点 500
コード長 3380 Byte
結果 AC
実行時間 493 ms
メモリ 21904 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 500 / 500
結果
AC × 2
AC × 11
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 02_corner_00.txt, 02_corner_01.txt, 02_corner_02.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 1788 KiB
00_sample_01.txt AC 1 ms 1920 KiB
01_random_00.txt AC 19 ms 3288 KiB
01_random_01.txt AC 487 ms 21904 KiB
01_random_02.txt AC 307 ms 15712 KiB
01_random_03.txt AC 487 ms 21864 KiB
01_random_04.txt AC 208 ms 10488 KiB
01_random_05.txt AC 493 ms 21824 KiB
02_corner_00.txt AC 18 ms 9296 KiB
02_corner_01.txt AC 1 ms 1992 KiB
02_corner_02.txt AC 16 ms 10592 KiB