求助大佬。想法是统计每个位小于他的那个数量
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int T, n, a[N];
int trie[N * 30][2], tot, siz[N * 30];
void insert(int x) {
if (!x)
return;
int p = 0;
for (int i = 29; i >= 0; --i) {
int ch = x >> i & 1;
if (!trie[p][ch])
trie[p][ch] = ++tot;
p = trie[p][ch];
siz[p]++;
}
}
int query(int x) {
int p = 0;
int dig = __lg(x);
// cout << "Digit:" << dig << endl;
if (dig == -1)
return n;
int ans = 0;
for (int i = 29; i >= dig; --i) {
if (!trie[p][0])
return 0;
p = trie[p][0];
}
for (int i = dig - 1; ~i; --i) {
bool ch = x >> i & 1;
if (!ch) {
if (!trie[p][0])
return ans;
p = trie[p][0];
} else {
if (trie[p][1])
ans += siz[trie[p][1]];
if (!trie[p][0])
return ans;
p = trie[p][0];
}
}
return ans + siz[p];
// +siz[p];
}
void solve() {
for (int i = 1; i <= tot; ++i)
siz[i] = 0, trie[i][0] = trie[i][1] = 0;
tot = 0;
cin >> n;
int ans = 0;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
insert(a[i]);
}
for (int i = 1; i <= n; ++i)
ans += query(a[i]);
cout << ans << '\n';
}
main() {
cin.tie(0)->sync_with_stdio(0);
for (cin >> T; T--;)
solve();
}