HDU-2017 多校训练赛3-1004-Kanade's trio
来源:互联网 发布:华为盒子看电影软件 编辑:程序博客网 时间:2024/06/17 18:39
ACM模版
描述
题解
这个题思路十分巧妙,没想到竟然可以用字母树解。
题解不难理解,就是有些出人意料了。看了题解后,我拿着官方题解,参考着写了一份,习惯性的将一些东西改成了自己的习惯……比如说,初始化能用
所以呢,以后一定要注意
代码
#include <iostream>#include <cstdio>using namespace std;typedef long long ll;const int MAXN = 5e5 + 10;const int MAGIC = 30;template <class T>inline void scan_d(T &ret){ char c; ret = 0; while ((c = getchar()) < '0' || c > '9'); while (c >= '0' && c <= '9') { ret = ret * 10 + (c - '0'), c = getchar(); }}int n, tot;int a[MAXN];int go[MAXN << 5][2];int num[MAXN << 5];int tree[MAXN][MAGIC][2];ll ss[MAXN << 5];int main(){ int T; scan_d(T); while (T--) { for (int i = 1; i <= tot; i++) { go[i][0] = go[i][1] = 0; ss[i] = num[i] = 0; } for (int i = 1; i <= n; i++) { for (int j = 0; j < MAGIC; j++) { tree[i][j][0] = tree[i][j][1] = 0; } } tot = 1; scan_d(n); for (int i = 1; i <= n; i++) { scan_d(a[i]); } for (int i = 1; i <= n; i++) { for (int j = 0; j < MAGIC; j++) { tree[i][j][0] = tree[i - 1][j][0]; tree[i][j][1] = tree[i - 1][j][1]; } for (int j = 0; j < MAGIC; j++) { int k = (a[i] & (1 << j)) > 0; tree[i][j][k]++; } } ll ans = 0; for (int i = n; i >= 1; i--) { int now = 1; for (int j = MAGIC - 1; j >= 0; j--) { int k = (a[i] & (1 << j)) > 0; if (go[now][k ^ 1]) { ans += ss[go[now][k ^ 1]] - num[go[now][k ^ 1]] * 1ll * tree[i][j][k]; } if (!go[now][k]) { break; } now = go[now][k]; } now = 1; for (int j = MAGIC - 1; j >= 0; j--) { int k = (a[i] & (1 << j)) > 0; if (!go[now][k]) { go[now][k] = ++tot; } now = go[now][k]; ss[now] += tree[i - 1][j][k ^ 1]; num[now]++; } } cout << ans << endl; } return 0;}
阅读全文
0 0
- HDU-2017 多校训练赛3-1004-Kanade's trio
- HDU 6059-Kanade's trio(多校训练第三场->01字典树)
- HDU-2017 多校训练赛3-1003-Kanade’s sum
- 2017多校训练Contest3: 1004 Kanade's sum hdu6059
- 【多校训练】hdu 6058 Kanade's sum
- 2017 多校训练第三场 HDU 6058 Kanade's sum
- 2017多校训练Contest3: 1003 Kanade's sum hdu6058
- HDU 6059 Kanade's trio
- [HDU]6059 Kanade's trio
- HDU 6059 Kanade's trio
- hdu 6059 Kanade's trio
- Kanade's trio 2017多校#3 trie
- HDU 6058-Kanade's sum(多校训练第三场->模拟)
- 2017多校三 1004题 hdu 6059 Kanade's trio Trie树 计数
- HDU 6059 Kanade's trio (字典树, 2017 Multi-Univ Training Contest 3)
- HDU 6059 Kanade's trio(2017 Multi-University Training Contest 3)
- HDU 6059 Kanade's trio 字典树
- Kanade's trio hdu 6059 字典树
- java 面试题整理一
- 嵌入式多功能电子相册之上位机
- 排列数组中数字得出最大数算法
- Android O 行为变更(二)
- 订阅Linux内核邮件列表
- HDU-2017 多校训练赛3-1004-Kanade's trio
- PipedOutputStream和PipedInputStream管道实现线程通信
- python爬虫上手 笔记<3>
- java8初探
- QAV250四轴穿越机安装全程详解(多图)
- 洛谷Oj-单词接龙-深度优先搜索
- webpack的基本使用(二)
- 背包九讲
- g++和gcc的区别