当前位置: 首页 > news >正文

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

考虑一棵从低位到高位的 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;
}
http://www.rkmt.cn/news/69609.html

相关文章:

  • 实用指南:满城草莓供销服务平台(需求文档)
  • 2025年北京离婚诉讼律师推荐排行榜,哪个好?哪个靠谱?选哪个?网站网址及联系电话
  • 2025年上海离婚纠纷律师电话联系方式汇总:上海地区专业律师联系方式及高效法律咨询指引
  • 2025西安留学机构推荐
  • 2025年深圳离婚纠纷律师电话联系方式汇总:深圳本地专业律师团队联系方式及高效法律咨询指引
  • 2025宁波权威留学机构有哪些学校
  • 2026年RV减速机轴承生产厂家推荐,专注角接触球轴承、交叉滚子轴承、柔性轴承,高精度、耐用耐磨
  • 笔记本电脑安装ubuntu20.04 intel AX101网卡没有无线功能
  • 2025国产DevOps厂商选型对比:兼容能力评估
  • uniapp开发微信小程序,调用百度地图api
  • 去哪找靠谱的自建房设计公司?2026自建房设计公司排行权威榜
  • 2025年北京协议离婚律师推荐排行榜,哪个好?哪个靠谱?选哪个?网站网址及联系电话
  • 2025出国留学中介联系方式
  • 2025成都好的留学中介专做川大
  • 限制开放端口利用技术汇总
  • 2025出国留学中介机构靠谱吗
  • 在天津市静海区老家农村盖房子,靠谱的自建房公司口碑推荐。天津市静海区自建房公司/机构权威测评推荐排行榜。
  • CTFshow-Web-RCE任意文件上传
  • 二零二五年十二月鲜花代运营服务商综合评测与排行:五家服务商深度对比与选择指南
  • 【IEEE出版 | EI检索】第六届机械自动化与智能制造国际学术会议(MAIM 2025)
  • 二零二五年十二月压缩机储液器厂家推荐榜:五家优质企业综合对比与选购指南
  • 2025深圳继承律师权威推荐榜单:离婚房产律师/股权分割律师/婚姻律师及机构精选
  • 杭州办婚礼哪里好榜单:2025杭州一站式婚礼排名出炉
  • XSS Labs-Level3题解
  • 2025重金属水质监测设备厂家有哪些指南:厂家技术亮点解析
  • 2025杭州草坪婚礼场地推荐:杭州结婚场地榜单大盘点
  • (论文速读)EgoLife:走向自我中心的生活助手 - 指南
  • 2025激光三维扫描仪十大品牌权威推荐榜单(国产化首选TOP10)
  • EMC实用技巧:利用近场探头抑制 LVDS 连接干扰​
  • 2025美白精华新风向:理性护肤者正转向这些精准之选