2025.9.6 NOIP 模拟赛 题解
T1 P110132 异或子段
题意
给定 \(a_{1\sim n}\), \(m\) 次询问每次给出 \(x\),求出 \(\sum_{l\le r,r-l+1=\max a_{l\sim r}}[\bigoplus a_{l\sim r}\le x]\),\(n,m\le10^6,1\le a_i\le n,0\le x<2^{20}\)
分析
显然满足 \(r-l+1=\max a_{l\sim r}\) 的 \([l,r]\) 数量不多,有很多方式可证其数量为 \(O(n\log n)\) 的,以下为我的考场证明
证明:
- 考虑按 \(a_i=1\sim n\) 依次令位置合法,并维护极大合法子段
- 令一个位置合法后,可能与左右两个位置合并,这一过程分解为加入一段与两次合并相邻段
- 考虑每次合并得到新段后将新产生的合法 \([l,r]\) 计入总数
- 加入的一段长度为 \(1\),只有加入的数为 \(1\) 时才产生一个合法区间,这部分贡献为 \(O(1)\)
- 合并两个长度分别为 \(l\) 和 \(r\) 的段时,产生贡献的区间包含中点且长度恒定,因此这样一次合并的贡献不超过 \(\min(l,r)\)
- 根据启发式合并的相关结论,显然总数量为 \(O(n\log n)\) 的
\(O(n+\text{cnt})\) 求出所有区间是容易的:预处理每个位置左侧的一个小于该位置与右侧第一个不大于该位置的,再结合必须与当前位置相交的限制,得到合法区间的取值范围,枚举之计入答案
枚举所有合法区间后,回答询问是容易的
总时间复杂度 \(O(n\log n+m)\)
T2 P110133 氧气堆
题意
给定 \(n,seed\),初始 \(ans=0\),保存有一个带编号数的集合(其中 \(seed,rs\) 和数集中的数都是 uint32_t 类型),定义函数 rnd():
unsigned rnd() {
seed ^= seed << 13;
seed ^= seed >> 17;
seed ^= seed << 5;
return (seed ^ ans) & 0xffffff;
}
进行以下过程:
- 调用 \(n\) 次
rnd(),得到 \(a_{1\sim n}\),将所有 \(a_i\) 依次加入数集,其中 \(a_i\) 的编号为 \(i\) - 进行 \(n-1\) 次以下操作:
- 令 \(o\) 为
rnd()%3 - 若 \(o=0\),则令 \(ans\) 异或上数集中的最小值
- 若 \(o=1\),则取出数集中的最小值(若有重复则选择最后加入的),令该最小值的值更新为
rnd(),编号不变,重新插入数集 - 若 \(o=2\),则令 \(x\) 为
rnd()%n+1,若编号为 \(x\) 的数在数集中则删去之
- 令 \(o\) 为
求出最终的 \(ans\),\(n\le10^7,0\le seed<2^{32}-1\),时限 \(2s\)
分析
注意到 rnd() 的结果在 \([0,2^{24})\) 中,因此数集中的数也在该范围内
每个 \(v\in[0,2^{24})\) 保存一个链表,按更新时间递减保存数集中等于 \(v\) 的编号集合
维护指针 \(p\) 和 \(mn\),表示只有 \(mn\) 和 \([p,2^{24})\) 桶中存在值
记录 \(rm_x\) 表示是否删去了编号为 \(x\) 的数
由 \(a_{1\sim n}\) 建立是容易的
每次操作前,\(p\) 单调向后移动直到遇到的一个不为空的桶,若 \(mn\) 桶空则令 \(mn\gets p\)
对于 \(o=0\) 的情况,令 \(ans\) 异或上 \(\min(p,mn)\) 即可
对于 \(o=1\) 的情况,先从 \(\min(p,mn)\) 桶中得到第一个元素的编号,然后删除该元素,用其编号建立新值后重新插回对应位置,并更新 \(mn\)
对于 \(o=2\) 的情况,直接令 \(rm\) 对应位置设为 \(1\) 即可
总时间复杂度 \(O(n+V)\),其中 \(V=2^{24}\)
T3 P110134 Toptrees 领先
题意
对于一棵树,定义 \((u,v)\) 为其合法二元组当且仅当 \(u\ne v\) 且 \(u,v\) 都是该树的重心,给定一个森林,对于每条边,求出能否将森林连成树,使得这条边为合法二元组,\(n,m\le 10^5,2\mid n\),\(n-m\le 1000\)
分析
假设一共 \(c\) 个连通块
对于边 \((u,v)\),预处理当前连通块中 \(u\) 和 \(v\) 两侧各自的点数 \(szu,szv\),设其他连通块大小依次为 \(s_{1\sim c-1}\)
则 \((u,v)\) 合法当且仅当存在 \(s_{1\sim c-1}\) 的一个子集 \(S\),使得 \(\sum S+szu=\frac n2\) 或 \(\sum S+szv=\frac n2\)
一种实现(考场实现)为令 \(f_{i,j}\) 表示用除第 \(i\) 个连通块外的 \(s\) 能否表示出总和 \(j\),每个 \(f_{i,\ast}\) 存为一个 bitset,对 \(i\) 分治可以做到 \(O(\frac {cn\log c}\omega+m)\)
另一种实现(题解实现)为令 \(f_{i,j}\) 表示 \(1\sim i\) 选出子集和为 \(j\) 的方案数对某个质数取模,要得到去除 \(i\) 的方案数时用类似多项式的方式即可,时间复杂度 \(O(cn+m)\)
T4 P110135 倒拔垂杨柳
题意
给定一棵边带权树,令 \(dis_u\) 表示以 \(1\) 为根时 \(u\) 到根的路径边权和,\(m\) 次询问,给定 \(x,y,z,t\),\(t=1\) 时求 \(\bigoplus_{u\in\text{subtree}_{root=x}(y)}\bigoplus_{v\in\text{subtree}_{root=x}(z)}dis_{\text{lca}_{root=x}(u,v)}\),\(t=2\) 时求 \(\bigoplus_{u\in\text{subtree}_{root=x}(y)}dis_{\text{lca}_{root=x}(u,z)}\),\(t=3\) 时求 \(\bigoplus_{v\in\text{subtree}_{root=x}(z)}dis_{\text{lca}_{root=x}(y,v)}\),\(t=4\) 时求 \(dis_{\text{lca}_{root=x}(y,z)}\),\(n,m\le2\times10^5\),边权 \(\le200\)
分析
令 \(\text{dlca}_r(x,y)=dis_{\text{lca}_{root=r}(x,y)}\),\(\text{dlca}(x,y)=\text{dlca}_1(x,y)\)
注意到 \(\text{dlca}_r(x,y)=\text{dlca}(x,y)\oplus \text{dlca}(r,x)\oplus \text{dlca}(r,y)\)
显然 \(t=4\) 可以 \(O(\log n)\) 回答,\(t=3\) 可以转化为 \(t=2\),\(t=1\) 经过拆分后转化为给定 \((x,y)\) 求 \(\bigoplus_{u\in\text{subtree}_{root=1}(x)}\bigoplus_{v\in\text{subtree}_{root=1}(y)}\text{dlca}(u,v)\) 和给定 \(x,y\) 求 \(\bigoplus_{u\in\text{subtree}_{root=1}(x)}\text{dlca}(u,y)\),\(t=2\) 拆分为给定 \(x,y\) 求 \(\bigoplus_{u\in\text{subtree}_{root=1}(x)}\text{dlca}(u,y)\)
先考虑后者,显然 \(y\) 在子树 \(x\) 外时等于 \((sz_x\bmod 2)\text{dlca}(x,y)\),\(y\) 在子树 \(x\) 中时等于 \(\sum_{i=1}^{\text{dis}(x,y)}((sz_{fa^i_y}-sz_{fa^{i-1}_y})\bmod 2)dis_{fa^{i-1}_y}\),预处理 \(pxr_u=\sum_{i\ge 1}((sz_{fa^i_u}-sz_{fa^{i-1}_u})\bmod 2)dis_{fa^{i-1}_u}\) 即可
然后考虑前者,\(x\) 与 \(y\) 互不在对方子树中时显然等于 \((sz_xsz_y\bmod 2)\text{dlca}(x,y)\),\(y\) 在 \(x\) 子树中时拆分为 \(\left(\bigoplus_{u\in(\text{subtree}_{root=1}(x)/\text{subtree}_{root=1}(y))}\bigoplus_{v\in\text{subtree}_{root=1}(y)}\text{dlca}(u,v)\right)\oplus \left(\bigoplus_{u\in\text{subtree}_{root=1}(y)}\bigoplus_{v\in\text{subtree}_{root=1}(y)}\text{dlca}(u,v)\right)\),其中前一项等于 \((sz_y\bmod 2)(pxr_x\oplus pxr_y)\),后一项等于 \(\bigoplus_{u\in\text{subtree}_{root=1}(y)}dis_u\),容易预处理
总时间复杂度 \(O(n+m\log n)\),瓶颈在于 \(\text{lca}\) 和给定 \(u,v\mid u\in \text{subtree}(v),u\ne v\) 求 \(v\) 在 \(u\) 方向上的儿子,可以做到 \(O(n\log n+m)\)
比赛结果
\(100+70+100+40\),\(\text{rk}13\)

浙公网安备 33010602011771号