树状数组73分求调
查看原帖
树状数组73分求调
531258
Fishmaster楼主2022/11/5 15:31
#include <bits/stdc++.h>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
int n, arr[100005], t1[100005], t2[100005];
ll ans;

void add1(int u, int k) {
	for (int i = u; i <= n; i += lowbit(i))
		t1[i] += k;
}

void add2(int u, int k) {
	for (int i = u; i <= n; i += lowbit(i))
		t2[i] += k;
}

int qsum1(int u) {
	int res = 0;
	for (int i = u; i; i -= lowbit(i))
		res += t1[i];
	return res;
}

int qsum2(int u) {
	int res = 0;
	for (int i = u; i; i -= lowbit(i))
		res += t2[i];
	return res;
}

int hsum1(int u) {
	return qsum1(n) - qsum1(u - 1);
}

int hsum2(int u) {
	return qsum2(n) - qsum2(u - 1);
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> arr[i];
		add2(arr[i], 1);
	}
	add1(arr[1], 1);
	add2(arr[1], -1);
	for (int i = 2; i < n; i++) {
		ans += qsum1(arr[i] - 1) * hsum2(arr[i] + 1);
		add1(arr[i], 1);
		add2(arr[i], -1);
	}
	cout << ans;
	return 0;
}
2022/11/5 15:31
加载中...