尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

神秘 Trick:Trie 维护全局加 1 查询全局异或和

神秘 Trick:Trie 维护全局加 1 查询全局异或和
📅 发布时间:2026/6/26 10:02:54

考虑一棵从低位到高位的 Trie.

每次全局加一,末位是 \(0\) 的数,末位会变成 \(1\);其他数,末位会变成 \(0\) 然后向前进位。

考虑直接交换左右子树,然后要进位的是交换后左子树的点,递归处理就行。

注意原来在节点 \(u\) 结束的数也会因为 \(+1\) 全部进入右子树,需要处理一下,可以参照代码理解。

由于每次只会递归一个子树,全局 \(+1\) 的复杂度是 \(O(\log V)\).

#include <bits/stdc++.h>
using namespace std;#define int long long
const int N = 525015, M = N * 25 + 5;int n, a[N], p, ch[M][2], tot, val[M], ans, root[N];
bool siz[M], ed[M];
vector<int> g[N];void pushup(int p)
{siz[p] = (ed[p] ^ siz[ch[p][0]] ^ siz[ch[p][1]]);val[p] = ((val[ch[p][0]] << 1) ^ ((val[ch[p][1]] << 1) | siz[ch[p][1]]));
}void insert(int &p, int k)
{if(!p) p = ++tot;if(!k) return (void) (ed[p] ^= 1, siz[p] ^= 1);insert(ch[p][k & 1], k >> 1);pushup(p);
}void modify(int p) // 全局 +1
{if(!p) return;swap(ch[p][0], ch[p][1]);if(ed[p] && !ch[p][1]) ch[p][1] = ++tot;ed[ch[p][1]] ^= ed[p], siz[ch[p][1]] ^= ed[p];ed[p] = 0;modify(ch[p][0]);pushup(p);return;
}void merge(int &x, int &y)
{if(!y) return;if(!x) return (void) (x = y);ed[x] ^= ed[y];val[x] ^= val[y];siz[x] ^= siz[y];merge(ch[x][0], ch[y][0]);merge(ch[x][1], ch[y][1]);pushup(x);return;
}void dfs(int u, int fa)
{for(auto v : g[u])if(v != fa) dfs(v, u), merge(root[u], root[v]);modify(root[u]);insert(root[u], a[u]);ans += val[root[u]];return;
}signed main()
{ios :: sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= n; i++) cin >> a[i];	for(int i = 2; i <= n; i++)cin >> p, g[p].push_back(i);dfs(1, 0);cout << ans;return 0;
}

其实还有全局 -1,维护方法是类似的。

例题是洛谷 P14509 树上求值。不过这题的贡献和位数有关,所以还要多记录一个 trie 树上的深度。


void pushup(int p, int h)
{val[p] = (val[ch[p][0]] * a[0][h] % m + val[ch[p][1]] * a[1][h] % m) % m;
}void insert(int &p, int k, int h)
{if(!p) p = ++tot;// cout << (k & 1);if(h > 20) return (void) (val[p]++);insert(ch[p][k & 1], k >> 1, h + 1);pushup(p, h);return;
}void modify(int p, int h) // 全局 -1
{if(!p) return;swap(ch[p][0], ch[p][1]);modify(ch[p][1], h + 1);pushup(p, h);return;
}void merge(int &x, int &y, int h)
{if(!y) return;if(!x) return (void) (x = y);val[x] += val[y]; val[x] %= m;if(h > 20) return;merge(ch[x][0], ch[y][0], h + 1);merge(ch[x][1], ch[y][1], h + 1);pushup(x, h);return;
}
望穿寂夜晨曦至,雄鹰展翅图九天。

相关新闻

  • 实用指南:满城草莓供销服务平台(需求文档)
  • 2025年北京离婚诉讼律师推荐排行榜,哪个好?哪个靠谱?选哪个?网站网址及联系电话
  • 2025年上海离婚纠纷律师电话联系方式汇总:上海地区专业律师联系方式及高效法律咨询指引

最新新闻

  • 几何美学与现代设计:为什么Montserrat字体成为开源字体的典范?
  • 高速ADC芯片ADS4222IRGCR选型、硬件设计与调试全攻略
  • Java毕业设计-基于 SpringBoot 的网上书店系统设计与实现 SpringBoot 框架下在线图书销售管理系统设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 诚信的免费降英文AI工具平台
  • 3分钟搞定asar文件:Windows平台最轻量级的可视化工具
  • 构建企业级远程协作平台:开源WebRTC技术栈的深度实践指南

日新闻

  • Qwen2.5-Turbo百万上下文实战指南:百炼平台长文本处理全解析
  • 怎么监控对标账号更新,2026年作者监控工作流,5款深度对比
  • EdgeRemover:专业级Windows Edge浏览器管理工具,彻底解决顽固软件卸载难题

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号