不用离散化,为啥只能70几分
查看原帖
不用离散化,为啥只能70几分
459618
GamerAnson楼主2023/2/10 20:38
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int tr1[N], tr2[N], a[N], b[N], le[N], re[N];
int n;

void add(int tr[], int x, int k) {
	for (; x <= n; x += x & -x)
		tr[x] += k;
}

int sum (int tr[], int x) {
	int res = 0;
	for (; x; x -= x & -x)
		res += tr[x];
	return res;
}
int maxx = 0;

int main() {
	ios::sync_with_stdio(false);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		b[i] = a[i];
		maxx = max(maxx, a[i]);
	}
//	sort(b + 1, b + 1 + n);
//	int m = unique(b + 1, b + 1 + n) - (b + 1);
//	for (int i = 1; i <= n; i++) {
//		a[i] = lower_bound(b + 1, b + 1 + m, a[i]) - b;
//
//		//	cout << a[i] << " ";
//	}
//	cout << m << endl;
	for (int i = 1; i <= n; i++) {
		le[i] = sum(tr1, a[i] - 1);
		add(tr1, a[i], 1);

	}
	for (int i = n; i >= 1; i--) {
		//	cout << sum(tr2, 10) << " " << sum(tr2, a[i]) << '\n';
		re[i] = sum(tr2, maxx) - sum(tr2, a[i]);
		add(tr2, a[i], 1);
	}
	long long ans = 0;
	for (int i = 1; i <= n; i++)
//		cout << le[i] << " " << re[i] << "\n";
		ans += le[i] * re[i];
	cout << ans;

	return 0;
}
2023/2/10 20:38
加载中...