HDU 6059 Kanade's trio (字典树, 2017 Multi-Univ Training Contest 3)
来源:互联网 发布:数据集市 知乎 编辑:程序博客网 时间:2024/05/20 22:40
Problem
含 N 个数字的 A 数组,求有多少个三元组 (i,j,k)
满足
Limit
Idea
利用字典树维护前 k-1 个数。当前处理第 k 个数。
显然对于 k 与 i 的最高不相同位
当
当
故利用数组 cnt[31][2]
统计每一位为 0 ,为 1 的有多少个(在前 K-1 个数中)。在字典树插入第 k 个数时,同时统计最高不相同位,即对于每次插入的 p 位为 num[p]
(取值 0 或 1),在同父节点对应的 1-num[p]
为根子树的所有节点均可作为 i 来寻找 j 以获取对答案的贡献。其中又仅要求 1-num[p]
) 相同,故 cnt[p][ 1-num[p] ]
种取值方案。
但是,同时需要注意 i 与 j 有在 A 数组的先后关系 (Ext
点,记录将每次新加入的点与多少原有点可构成 i, j
关系。在后续计算贡献时去掉。
Code
#include<bits/stdc++.h>using namespace std;const int N = 500000 + 10;const int Node_max = N * 31;int T, n, num[30], a[N], cnt[31][2];long long ext = 0, ans;struct Node{ int nxt[2]; int cnt, ext;} Trie[Node_max];int Tsize;void calc(int tmp, long long c) { ans += Trie[tmp].cnt * 1ll * (Trie[tmp].cnt - 1) / 2; ext += (c-Trie[tmp].cnt) * 1ll * Trie[tmp].cnt - Trie[tmp].ext;}void Trie_insert(int idx){ int tmp = 0; for(int i=0;i<30;i++) { if(!Trie[tmp].nxt[ num[i] ]) { Trie[tmp].nxt[ num[i] ] = ++Tsize; } if(Trie[tmp].nxt[ 1-num[i] ]) { calc(Trie[tmp].nxt[ 1-num[i] ], cnt[i][ 1-num[i] ]); } tmp = Trie[tmp].nxt[ num[i] ]; Trie[tmp].cnt++; Trie[tmp].ext += cnt[i][num[i]] - Trie[tmp].cnt; } return; }int main(){ scanf("%d", &T); while(T-- && scanf("%d", &n)!=EOF) { memset(Trie, 0, Tsize * 16 + 16); memset(cnt, 0, sizeof(cnt)); Tsize = 0; ans = 0; ext = 0; for(int i=1, tmp;i<=n;i++) { scanf("%d", &a[i]); tmp = a[i]; for(int j=29;j>=0;j--) { num[j] = tmp%2; cnt[j][tmp%2]++; tmp /= 2; } Trie_insert(i); } printf("%lld\n", ans + ext); }}
阅读全文
3 0
- HDU 6059 Kanade's trio (字典树, 2017 Multi-Univ Training Contest 3)
- HDU 6059 Kanade's trio(2017 Multi-University Training Contest 3)
- HDU 6058 Kanade's sum (链表, 2017 Multi-Univ Training Contest 3)
- HDU 6059 Kanade's trio 字典树
- Kanade's trio hdu 6059 字典树
- hdu 6059 Kanade's trio(字典树)
- HDU 6059 Kanade's trio【字典树】
- HDU 6096 String (字典树, 2017 Multi-Univ Training Contest 6)
- HDU 6059 Kanade's trio 字典树 统计 容斥
- HDU-6059 Kanade's trio(字典树)
- HDU 6059 Kanade's trio(字典树)
- hdu 6059 Kanade's trio(字典树+位压缩)
- HDU 6059 Kanade's trio (字典树)
- HDU 6138 Fleet of the Eternal Throne (后缀数组+字典树, 2017 Multi-Univ Training Contest 8)
- HDU 6059 Kanade's trio
- [HDU]6059 Kanade's trio
- HDU 6059 Kanade's trio
- hdu 6059 Kanade's trio
- HDU 6063 RXD and math
- XGBoost 与 信用卡诈骗数据集 三
- Hibernate的HelloWorld
- 《背包九讲》
- 长连接与短连接的区别以及使用场景
- HDU 6059 Kanade's trio (字典树, 2017 Multi-Univ Training Contest 3)
- 网页特殊符号HTML代码大全
- 人工智能
- 无刷电机学习笔记
- MySQL数据库同时查询更新同一张表
- 全面认识ES6(一)
- jni教程(AndroidStudio)
- 台湾新唐MCU
- 并查集详解