給定 N(≤105)個技能值,求無序數對 (i,j) 使得 ai ⊕ aj > max(ai, aj)。
設 x < y。則 x ⊕ y > y **當且僅當** y 的最高位在 x 中為 0。
即:x 的最高位**必須低於** y 的最高位。
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T; cin >> T;
while (T--) {
int n; cin >> n;
vector a(n);
for (int &x : a) cin >> x;
sort(a.begin(), a.end());
long long ans = 0;
array cnt{}; // 最高位 0..30
for (int x : a) {
int hb = 31 - __builtin_clz(x); // 最高位位置
for (int b = 0; b < hb; ++b) ans += cnt[b];
cnt[hb]++;
}
cout << ans << '\n';
}
return 0;
}
O(N log N + N × 31),線性通過。