CF817E Choosing TheCommander(01Trie)

题目链接

  题意:实现三种操作1.p加入集合中,2.p从集合中删去,3.查询集合中所有的树在异或p之后有多少个数小于l.
  思路:看到跟异或的统计数字问题,所以考虑用01Trie树来实现这些操作,将p加入到集合或从集合中删除,就是很正常的Trie树的操作,将每一个数的各个二进制位都存入到树中。查询操作,考虑l当前位是0/1,如果是0的话异或不会改变该位,所以继续沿着当前的路径走下去,相反出现1就将0这一分支的答案统计下来,并向相反的方向走。

constexpr int N = 5e6 + 10; #define int i64 int tr[N][2], sum[N]; int idx = 1; void add(int p, int z) { int u = 1; for (int i = 31; i >= 0; i--) { bool x = p & (1 << i); if (!tr[u][x]) tr[u][x] = ++idx; u = tr[u][x]; sum[u] += z; } } int query(int p, int l) { int ans = 0, u = 1; for (int i = 31; i >= 0; i--) { bool x = p & (1 << i), y = l & (1 << i); if (y) ans += sum[tr[u][x]], u = tr[u][x ^ 1]; else u = tr[u][x]; } return ans; } signed main() { std::cin.tie(nullptr)->sync_with_stdio(false); int q; std::cin >> q; while(q--) { int op; std::cin >> op; int p; std::cin >> p; if (op == 1) { add(p, 1); } else if (op == 2) { add(p, -1); } else { int l; std::cin >> l; std::cout << query(p, l) << "\n"; } } }

__EOF__

本文作者HoneyGrey
本文链接https://www.cnblogs.com/Haven-/p/16700432.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   浅渊  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示