【名词解释】
第一行输入一个整数
代表数组中的元素个数。
第二行输入
个整数
代表数组中的元素。
输出一个整数,表示满足条件的三元组个数。
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; }