求助,离样例只差 1
查看原帖
求助,离样例只差 1
363006
wangyibo201026楼主2022/5/6 14:53
#include<bits/stdc++.h>

#define int long long
#define end '\n'

#define lowbit(x) x & -x

using namespace std;

const int N = 2e4 + 5;

int t;

int n;
int l1[N], u2[N];

struct Node{
	int x, id;
}a[N];

struct BIT{
	int tree[N];
	void init(){
		memset(tree, 0, sizeof(tree));
	}
	void update(int x, int val){
		while(x <= n){
			tree[x] += val;
			x += lowbit(x);
		}
	}
	int query(int x){
		int sum = 0;
		while(x){
			sum += tree[x];
			x -= lowbit(x);
		}
		return sum;
	}
}TR;

int l_xt[N], r_xt[N];
map<int, int> mp;

void Solve(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i].x;
		a[i].id = i;
	}
	for(int i = 1; i <= n; i++){
		l_xt[i] = mp[a[i].x];
		mp[a[i].x]++;
	}
	mp.clear();
	for(int i = n; i >= 1; i--){
		r_xt[i] = mp[a[i].x];
		mp[a[i].x]++;
	}
	sort(a + 1, a + 1 + n, [](Node x, Node y){return x.x > y.x;});
	for(int i = 1; i <= n; i++){
		u2[a[i].id] = TR.query(n) - TR.query(a[i].id - 1) - r_xt[a[i].id];
		TR.update(a[i].id, 1);
	}
	TR.init();
	sort(a + 1, a + 1 + n, [](Node x, Node y){return x.x < y.x;});
	for(int i = 1; i <= n; i++){
		l1[a[i].id] = TR.query(a[i].id) - l_xt[a[i].id];
		TR.update(a[i].id, 1);
	}
	int sum = 0;
	for(int i = 1; i <= n; i++){
		sum += l1[a[i].id] * u2[a[i].id];
		// cout << l1[a[i].id] << " " << u2[a[i].id] << " " << a[i].id << endl;
	}
	cout << sum << endl;
}

signed main(){
  Solve();
  return 0;
}
2022/5/6 14:53
加载中...