【名词解释】
第一行输入一个整数
代表数组中的元素个数。
第二行输入
个整数
代表数组中的元素。
输出一个整数,表示满足条件的三元组个数。
5 1 5 4 2 3
2
在这个样例中,满足条件的三元组有:
、
且
构成的三元组
;
、
且
构成的三元组
。
20 -6 -9 -90 -73 89 -90 2 19 52 -16 -41 -22 85 24 -22 66 75 78 48 -36
134
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) (x).begin(),(x).end()
#define ceil(a,b) ((a)+(b)-1)/(b)
class Treearray
{
public:
vector<int> t;
int n;
Treearray(int _n):n(_n){t.resize(n+5);}
inline int lowbit(int x){return x&(-x);}
void insert(int pos,int val){for(int i=pos;i<=n;i+=lowbit(i))t[i]+=val;}
int query(int pos){int res=0;for(int i=pos;i;i-=lowbit(i))res+=t[i];return res;}
void rangeinsert(int l,int r,int val){insert(l,val),insert(r+1,-val);}
};
void lsh(vector<int> &a)
{
//#define all(x) (x).begin(),(x).end()
vector<int> b=a;
sort(all(b));
b.erase(unique(all(b)),b.end());
for(auto &x:a)
x=lower_bound(all(b),x)-b.begin()+1;
}
void solve()
{
int n;
cin>>n;
vector<int> a(n);
for(int i=0;i<n;i++) {
int x;
cin>>x;
x += 1e9 + 5;
a[i] = x;
}
lsh(a);
n = a.size();
// t0 统计 ai > aj 在[i, n]的数量
// t1 统计 ai >= aj 在[i, n]的数量
// t2 统计 ai > aj >= ak 在[i, n]的数量
Treearray t0(n+10), t1(n+10), t2(n+10);
int cnt = 0, sum = 0;
for(int i=n-1;i>=0;i--) {
int t = t0.query(a[i]);
sum += t * (t - 1) / 2;
t0.rangeinsert(a[i]+1, n+3, 1);
int count = t1.query(a[i]);
t1.rangeinsert(a[i], n+3, 1);
cnt += t2.query(a[i]);
t2.rangeinsert(a[i]+1, n+3, count);
}
// (ai > ak > aj)的数量总和 = (ai > ak && ai > aj)的数量总和 - (ai > aj >= ak)的数量总和
cout << sum - cnt << '\n';
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}