【CodeChef-XRQRS】Xor Queries【可持久化Trie / +主席树】
2016-04-22 08:27
351 查看
【题目链接】
有中文题面就不发题意了。
似乎维护一个可持久化Trie和一个主席树就可以做了,但是仔细想想好像只需要一个可持久化Trie就完了。
脑补了一下Trie上找第k大和统计数个数,似乎是对了。
1A了。。
有中文题面就不发题意了。
似乎维护一个可持久化Trie和一个主席树就可以做了,但是仔细想想好像只需要一个可持久化Trie就完了。
脑补了一下Trie上找第k大和统计数个数,似乎是对了。
1A了。。
/* Pigonometry */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 500005, maxk = 21, maxnode = maxn * maxk; int root[maxn], triecnt, son[maxnode][2], sum[maxnode], bin[maxk]; inline int iread() { int f = 1, x = 0; char ch = getchar(); for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1; for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; return f * x; } inline void insert(int &pos, int c) { int now = ++triecnt, last = pos; pos = now; for(int i = maxk - 1; i >= 0; i--) { son[now][0] = son[last][0]; son[now][1] = son[last][1]; sum[now] = sum[last] + 1; bool ind = c & bin[i]; last = son[last][ind]; now = son[now][ind] = ++triecnt; } son[now][0] = son[last][0]; son[now][1] = son[last][1]; sum[now] = sum[last] + 1; } inline int query(int last, int now, int c) { int ans = 0; for(int i = maxk - 1; i >= 0; i--) { bool ind = c & bin[i]; if(sum[son[now][ind ^ 1]] - sum[son[last][ind ^ 1]] > 0) now = son[now][ind ^ 1], last = son[last][ind ^ 1], ans |= (ind ? 0 : bin[i]); else now = son[now][ind], last = son[last][ind], ans |= (ind ? bin[i] : 0); } return ans; } inline int findless(int last, int now, int c) { int ans = 0; for(int i = maxk - 1; i >= 0; i--) { bool ind = c & bin[i]; if(ind) ans += sum[son[now][0]] - sum[son[last][0]]; if(sum[son[now][ind]] - sum[son[last][ind]] == 0) return ans; now = son[now][ind]; last = son[last][ind]; } ans += sum[now] - sum[last]; return ans; } inline int findkth(int last, int now, int k) { int ans = 0; for(int i = maxk - 1; i >= 0; i--) { int tmp = sum[son[now][0]] - sum[son[last][0]]; if(tmp >= k) now = son[now][0], last = son[last][0]; else k -= tmp, now = son[now][1], last = son[last][1], ans |= bin[i]; } return ans; } int main() { bin[0] = 1; for(int i = 1; i < maxk; i++) bin[i] = bin[i - 1] << 1; int n = 0; for(int T = iread(); T; T--) { int opt = iread(); if(opt == 0) { int x = iread(); n++; insert(root = root[n - 1], x); } else if(opt == 1) { int l = iread(), r = iread(), x = iread(); printf("%d\n", query(root[l - 1], root[r], x)); } else if(opt == 2) { int k = iread(); n -= k; triecnt = root[n + 1] - 1; } else if(opt == 3) { int l = iread(), r = iread(), x = iread(); printf("%d\n", findless(root[l - 1], root[r], x)); } else if(opt == 4) { int l = iread(), r = iread(), k = iread(); printf("%d\n", findkth(root[l - 1], root[r], k)); } } return 0; }
相关文章推荐
- poj2778.DNA Sequence (Trie图 && 矩阵乘)
- 第1课 GUI程序原理分析
- Light oj 1048Conquering Keokradong
- mosquitto 设置用户和密码
- HDU 1711 Number Sequence
- 300. Longest Increasing Subsequence
- Do not request Window.FEATURE_SUPPORT_ACTION_BAR
- 关于WPF的Button 的click事件调用 code UI 代码的示例(有益于快速的自动化)
- data-model 简单介绍
- 简单日历封装
- Deque 容器
- Queue容器
- Xcode中buildSetting参数设置与学习
- 在iOS 8中使用UIAlertController
- mysql_query返回false原因
- Java基础-break,continue,return
- iOS开发系列--UITableView全面解析
- UE4:编辑器中显示物体包围框
- 十六进制string转换UIColor -备用
- HDU - 1159 Common Subsequence