首页 > 代码库 > hdu6059[字典树+思维] 2017多校3
hdu6059[字典树+思维] 2017多校3
#include <bits/stdc++.h> using namespace std; typedef long long LL; int trie[31 * 500005][2]; int no[31 * 500005]; int sz[31 * 500005]; int sum[31][2]; int T, n, temp, tot = 0; LL ans = 0; void solve(int x) { int now = 0; for (int i = 29; ~i; i--) { int bit = (x & (1 << i)) ? 1 : 0; sum[i][bit]++; if (!trie[now][bit]) { trie[now][bit] = ++tot; } if (trie[now][1 ^ bit]) { //存在兄弟节点,即有符合的(Ai,Aj) int bro = trie[now][1 ^ bit]; ans += 1LL * sz[bro] * (sz[bro] - 1) / 2; ans += 1LL * (sum[i][1 ^ bit] - sz[bro]) * sz[bro] - no[bro]; } now = trie[now][bit]; sz[now]++; no[now] += sum[i][bit] - sz[now];//除去不符合j>i的(Ai,Aj),要累加 //cout << now << ‘ ‘ << no[now] << endl; } } void init() { memset(trie, 0, sizeof(trie)); memset(no, 0, sizeof(no)); memset(sum, 0, sizeof(sum)); memset(sz, 0, sizeof(sz)); ans = 0, tot = 0; } int main() { scanf("%d", &T); while (T--) { init(); scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &temp); solve(temp); } printf("%lld\n", ans); } }
hdu6059[字典树+思维] 2017多校3
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。