路过dalao帮忙看一下吧
查看原帖
路过dalao帮忙看一下吧
519384
Link_Cut_Y楼主2021/12/19 13:05
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define int long long

using namespace std;

const int N = 3e4 + 10;
int n, a[N], a1[N];
int tr1[N], tr2[N], up[N], down[N];
int m;

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

void modify(int *tr, int x, int v)
{
	for (int i = x; i <= N; i += lowbit(i))
		tr[i] += v;
}

int query(int *tr, int r)
{
	int res = 0;
	for (int i = r; i; i -= lowbit(i))
		res += tr[i];
		
	return res;
}

int find(int val)
{
	return lower_bound(a1 + 1, a1 + m + 1, val) - a1;
}

signed main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ )
		cin >> a[i], a1[i] = a[i];
		
	sort(a1 + 1, a1 + n + 1);
	m = unique(a1 + 1, a1 + n + 1) - (a1 + 1);
	
	for (int i = 1; i <= n; i ++ )
	{
		auto &y = a[i];
		modify(tr1, find(y), 1);
		down[i] = query(tr1, find(y) - 1);
	}
	
	for (int i = n; i; i -- )
	{
		auto &y = a[i];
		modify(tr2, find(y), 1);
		up[i] = n - i - query(tr2, find(y) - 1);
	}
	
	int res = 0;
	for (int i = 2; i < n; i ++ )
		res += down[i] * up[i];
		
	cout << res << endl;
	return 0;
}
2021/12/19 13:05
加载中...