【集训DAY15】简单计算【树状数组】【数学】

119 篇文章 0 订阅
26 篇文章 0 订阅

在这里插入图片描述

思路:

我们先统计可以相同的,然后把它减掉就可以了

c o d e code code

#include<iostream>
#include<algorithm>
#include<cstdio>

using namespace std;

const long long MAXN = 1e5 + 10;

long long n;
long long a[MAXN], l[MAXN], r[MAXN], l1[MAXN], r1[MAXN];
long long cl[MAXN], cr[MAXN];
long long tot, k[MAXN];

long long lowbit(long long x) { return x & -x; }

void add_l(long long x) {
	for(; x <= MAXN - 10; x += lowbit(x)) cl[x] ++;
}

long long query_l(long long x) {
	long long ans = 0;
	for(; x; x -= lowbit(x)) ans += cl[x];
	return ans;
}

void add_r(long long x) {
	for(; x <= MAXN - 10; x += lowbit(x)) cr[x] ++;
}

long long query_r(long long x) {
	long long ans = 0;
	for(; x; x -= lowbit(x)) ans += cr[x];
	return ans;
}

int main() {
	freopen("a.in", "r", stdin);
	freopen("a.out", "w", stdout);
	scanf("%lld", &n);
	for(long long i = 1; i <= n; i ++) scanf("%lld", &a[i]), k[i] = a[i];
	sort(k + 1, k + 1 + n);
	int tot = unique(k + 1, k + 1 + n) - k - 1;
	for(long long i = 1; i <= n; i ++) a[i] = lower_bound(k + 1, k + 1 + tot, a[i]) - k;
	long long s1 = 0, s2 = 0;
	for(long long i = 1; i <= n; i ++) {
		add_l(a[i]);
		s1 += query_l(a[i] - 1);
		l[i] = query_l(a[i] - 1);
		l1[i] = query_l(MAXN) - query_l(a[i]);
	}
	for(long long i = n; i >= 1; i --) {
		add_r(a[i]);
		s2 += query_r(a[i] - 1);
		r[i] = query_r(MAXN) - query_r(a[i]);
		r1[i] = query_r(a[i] - 1);
	}
	long long s3 = 0;
	for(long long i = 1; i <= n; i ++) s3 += l[i] * r1[i] + r[i] * l1[i] + l1[i] * l[i] + r[i] * r1[i];
	printf("%lld", s1 * s2 - s3);
 	return 0;
}
/*
a b c d
1 4 4 3
1 4 4 2
1 3 3 2
*/

/*
1 4
1 3
1 2

3 2
4 2
4 3
*/
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值