当前位置: 首页 > 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.jsqmd.com/news/59182/

相关文章:

  • 2025年pph管厂家权威推荐榜单:pp管件‌/pp聚丙烯管‌/pp塑料管‌源头厂家精选
  • 2025年新疆高三复读班权威推荐榜单:高三集训班/高三补习班/高三复读全日制学校精选
  • 2025自动化巡检能力对比:自动化运维厂商如何破解合规与效率双重挑战?
  • 2025年上海协议离婚律师推荐排行榜,哪个好?哪个靠谱?选哪个?网站网址及联系电话
  • 基于深度学习的西红柿成熟度检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
  • 实用指南:满城草莓供销服务平台(需求文档)
  • 2025年上海离婚诉讼律师推荐排行榜,哪个好?哪个靠谱?选哪个?网站网址及联系电话
  • 基于Jousselme距离的改进D-S证据理论MATLAB实现
  • 河北城普制冷设备有限责任公司联系方式:行业资质与合规联络建议说明
  • 在河北保定安新县老家农村盖房子,自建房公司哪家靠谱?安新县自建房公司TOP6口碑推荐排行榜
  • 2025年上海离婚律师电话联系方式汇总:上海核心区域专业律师联系方式及高效法律咨询指引
  • 2025年上海子女抚养权律师电话联系方式汇总: 核心城区资深律师官方联系方式及高效沟通指引
  • 2025年上海离婚纠纷律师电话联系方式汇总: 上海地区专业律师联系方式及高效法律咨询指引
  • 2025年北京离婚诉讼律师推荐排行榜,哪个好?哪个靠谱?选哪个?网站网址及联系电话
  • 按位取反可视化工具(~x)
  • 2025年上海离婚纠纷律师电话联系方式汇总:上海地区专业律师联系方式及高效法律咨询指引
  • 2025年上海离婚纠纷律师电话联系方式汇总: 重点区域专业律师联系方式及高效法律咨询指引
  • 2025年深圳遗嘱咨询律师电话完整汇总:重点区域资深律师联系方式与高效咨询指引
  • 2025年深圳继承纠纷律师电话联系方式汇总:深圳地区资深律师联系方式与高效法律咨询指引
  • 2025西安留学机构推荐
  • 2025年全网热议的简约智能家居照明源头厂家精选推荐榜
  • 2025沈阳最权威的留学机构
  • 2025年深圳离婚纠纷律师电话联系方式汇总:深圳本地专业律师团队联系方式及高效法律咨询指引
  • 2025宁波权威留学机构有哪些学校
  • 2025年北京婚姻律所推荐排行榜,哪家好?哪家靠谱?选哪家?网站网址及联系电话
  • 2025年深圳股权分割律师推荐排行榜,哪个好?哪个靠谱?选哪个?网站网址及联系电话
  • 2025年上海离婚律所电话联系方式汇总: 精选5家机构官方联系渠道及高效沟通指南
  • 2025南京十大留学中介
  • 2025年深圳离婚律师电话联系方式汇总:深圳本地资深律师官方联系方式与高效法律咨询指引
  • 北京大望路中西医结合医院 联系方式:了解医院背景与就医流程建议