給定長度 n (n ≤ 2×10^5) 的排列,求三元組 (i,j,k) 滿足 i
leftGreater[i] = 已插入元素中 > a[i] 的個數 = i-1 - query(rank[i])。插入 rank[i]。rightSmaller[i] = 未插入元素中 < a[i] 的個數 = query(rank[i]-1)。插入 rank[i]。Σ leftGreater[i] * rightSmaller[i] (64 位)。struct Node { int val, idx; } a[MAXN];
int bit[MAXN], rank[MAXN];
long long leftG[MAXN], rightS[MAXN];
void add(int i, int v) { for (; i<=n; i+=i&-i) bit[i] += v; }
int sum(int i) { int s=0; for(;i>0;i-=i&-i) s+=bit[i]; return s; }
int main() {
cin >> n;
for (int i=1;i<=n;++i) { cin>>a[i].val; a[i].idx=i; }
sort(a+1, a+n+1, [](Node x, Node y){ return x.val=1;--i) {
rightS[i] = sum(rank[i]-1);
add(rank[i], 1);
}
long long ans = 0;
for (int i=1;i<=n;++i) ans += leftG[i] * rightS[i];
cout << ans << '\n';
}
long long。rank[i]-1 為嚴格小於)。