01-trie 求助
查看原帖
01-trie 求助
246331
mystic_qwq楼主2024/8/22 00:09

求助大佬。想法是统计每个位小于他的那个数量

#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();
}
2024/8/22 00:09
加载中...