提出 #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 |
| 結果 |
|
|
| セット名 |
テストケース |
| 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 |