杂题20210427
一道题
有一个
01
序列 \(a_0,\ a_1,\ \cdots,\ a_{n-1}\) ,其中 \(n=2^k\) ,定义其权值为, \([0,\ n-1]\) 的线段树上,有多少个节点代表的区间内的权值不均为 \(0\) 或均为 \(1\)给定 \(q\) 个区间 \([l_i,\ r_i]\) ,你可以选择其中若干个区间,若一个区间 \([l,\ r]\) 被选中了,则会让这段区间内的 \(a_i\) 异或 \(1\)
求 \(2^q\) 种选择方案,得到的序列的权值之和 \(\bmod998244353\)
\(n,\ q\leq2\times10^5\)
考虑一个线段树节点 \([x,\ y]\) 会造成的贡献
我们仅考虑每个询问与 \([x,\ y]\) 有交的部分 \(l'=\max(l,\ x),\ r'=\min(r,\ y)\) ,容斥一下变成统计有多少种选择方案使得 \([x,\ y]\) 变为全 \(1\) 或全 \(0\) (记一下包含区间 \([x,\ y]\) 的询问个数即可)
我们将 \([x,\ y]\) 中的每一个下标看作一个二进制位,那么就变成了问这些询问构成的线性基的自由元数量
做一次差分,给 \([x,\ y+1]\) 中每个下标都建一个点,一个区间只会影响 \(l,\ r+1\) 两个位置,将这两个点连边,若两个点之前已经连通,可以发现现在这个区间能够被树链上的边表示出来
那么现在的问题就变为了求连通块数,对于单个线段树节点用并查集即可,将区间变得全相等的方案数为 \(2^{|q-连通块数+1|}\) ,判一下能否组成 \(1\) 即可
而一个询问 \([l,\ r]\) ,会给所有包含它的线段树节点 \(x\leq l\leq r\leq y\) 做一次完整贡献;会给至多两个线段树区间分别 \([l,\ k],\ [k+1,\ r]\) ,其中 \(k\) 是 \([l,\ r]\) 在线段树上第一次分裂的中间位置;会给 \(l\leq x\leq y\leq r\) 的计数器 \(+1\)
那么边数总和是 \(O(n\log n)\) 的,使用并查集即可
一道题
给定 \(m\times m\) 矩形上的 \(n\) 个矩形,选一对矩形,最小化 排除这对矩形后,被矩形至少覆盖一次的格点数目
\(m\leq1500;\ n\leq3\times10^5\)
\(\displaystyle\sum m^2\leq6\times10^7;\ \sum n\leq3\times10^6\)
时限 6s
首先求出每个格点被覆盖的次数,没有被覆盖和至少被覆盖三次的格点对答案没有贡献
求答案相当于选两个矩形,最大化:被恰好一个矩形覆盖的格点中,分别被这两个矩形覆盖的格点数;被恰好覆盖两次,且这两次覆盖是选的矩形的格点
我们对每个矩形,将其内部所有格点加上它的编号,我们就可以得知每个被覆盖恰好一次的格点是被哪个矩形覆盖
考虑从被覆盖恰好一次拓展到两次,只需维护两个可减信息,并且用这两个可减信息能够推出两个编号,维护和与平方和即可
时间复杂度 \(O(n+m^2)\)
CF995F Cowmpany Cowmpensation
给一棵以 \(1\) 为根的树,给每个节点分配工资 \([1,\ D]\) ,子节点不能超过父亲节点的工资,求分配方案数 \(\bmod10^9+7\)
\(n\leq3000;\ D\leq10^9\)
记 \(f_{i,\ j}\) 为,考虑 \(i\) 的子树,内部有恰好 \(j\) 个不同的元素的方案数,答案即为
对于合并两棵子树 \(f,\ g\to h\) 的转移,有
即枚举两棵子树有恰好 \(k\) 个值是相同的
时间复杂度 \(O(n^3)\) ,可以套个 fft 但难以通过
考虑最暴力的 dp,记 \(f_{u,\ i}\) 为考虑 \(u\) 的子树, \(u\) 的工资为 \(i\) 的方案数,转移有
记 \(g_{u,\ i}=\displaystyle\sum_{j=1}^if_{u,\ j}\) , \(g_{u,\ i}-g_{u,\ i-1}=f_{u,\ i}=\displaystyle\prod_{v\in son(u)}g_{v,\ i}\)
可以发现乘法的次数恰好是子树大小,不妨假设 \(g_u\) 是一个关于 \(i\) 的次数与子树大小有关的多项式
对于叶子有 \(g_{u,\ i}=i\) ,因此可以归纳证明
那么求出 \(D=n+1\) 的 dp 数组,做一遍插值即可做到 \(O(n^2)\)
auoj422
考虑生成一棵 \(n+1\) 个点的带边权树
给 \(2\leq i\leq n+1\) 中的每个点等概率随机一个 \([1,\ i-1]\) 间的父亲,边权为 \(a_{i-1}\)
定义序列 \(a_1,\ a_2,\ \cdots,\ a_n\) 的权值为生成的树的所有无序点对的距离距离和的期望
给定序列 \(a_i\) , \(q\) 次询问 \(a_i\) 子区间 \([l,\ r]\) 形成的序列的权值 \(\bmod 998244353\)
\(n,\ q\leq5\times10^4\)
先考虑整个序列的答案
枚举点 \(i\) ,枚举其子树大小(以 \(1\) 为根,不考虑点 \(i\)),对其与其父亲的边计算贡献,则答案为
仅考虑后半部分
考虑组合意义, \(\displaystyle\sum_{j=i}^n(n-j+1)\binom ji\) 相当于在 \(n+2\) 个位置中选 \(i+2\) 个,而所枚举的 \(j+1\) 就是选取的位置中的倒数第二个,前半部分 \(j\) 个中还要选 \(i\) 个,后半部分 \(n-j+1\) 还要选 \(1\) 个
那么有原式
不妨记 \(\displaystyle b_i=\frac{i}{(i+1)(i+2)}\) ,记 \(len=r-l+1\) ,那么有询问 \([l,\ r]\) 的答案为
这相当于是让 \(b_i\) 与 \(a_i\) 的一段区间做一遍差卷积
将原序列分块,对每个块都预处理,当 \(r\) 取到这个块的右端点时,每个 \(l\) 的答案,做 \(\sqrt n\) 次卷积即可
时间复杂度 \(O(n\sqrt{n}\log n)\)
Luogu7481 梦现时刻
给定 \(n,\ m\ (m\leq n)\) ,令 \(F(a,\ b)=\displaystyle\sum_{i=0}^b\binom bi\binom{n-i}a\) ,求 \(\displaystyle\bigoplus_{a=1}^m\bigoplus_{b=1}^m(F(a,\ b)\bmod998244353)\)
\(1\leq n\leq10^9,\ 1\leq m\leq5000\)
将和式中的 \(\displaystyle\binom bi\) 和 \(\displaystyle\binom{n-i}a\) 分别拆成 \(\displaystyle\binom{b-1}{i}+\binom{b-1}{i-1}\) 和 \(\displaystyle\binom{n-i-1}{a}+\binom{n-i-1}{a-1}\)
将 \(n\) 也看作变量,记 \(f(n,\ a,\ b)\) 为固定 \(n,\ a,\ b\) 时的答案,那么有
联立可得
联立第二式和第四式可得
得到了一个仅与 \(n\) 有关的递推式,预处理 \(a=0,\ b=0\) 的答案并递推即可
LOJ6585「ICPC World Finals 2019」机器人 Karel
记 \(f_{X,\ i,\ j,\ r}\) 为,考虑子程序 \(X\) ,从 \((i,\ j)\) 以方向 \(r\) 出发,所得到的答案。
操作 m
,l
,X
都可以较为简单地实现,对于操作 i
和 u
,不妨隐性地将其看作另一个子程序,做一遍递归即可。答案为 inf
即为递归中存在环
挂一道不会的题
一棵以 \(1\) 为根,边权为 \(1\) 的树, \(i=2,\ 3,\ \cdots,\ n\) 的父亲在 \(i\) 的真约数中随机选择,问两两点对距离之和的期望
\(n\leq3\times10^5\)
LOJ6476「ICPC World Finals 2017」复制,复制,复制并变异 Replicate Replicate Rfplicbte
细胞自动制造公司(Automatic Cellular Manufacturing)最近刚刚获得批量生产零件的新工艺专利。它的方法使用到包含两种细胞状态的二维网格,每个单元的细胞要么为空,要么为满。当然,具体的细节是专有的。
最初,网格中的一组单元被填充为需要复制的细胞副本。进过一系列离散的步骤,网格中的每个单元会根据自身及附近的八个单元的状态同步进行细胞状态更新。如果这九个单元中有奇数个位置的细胞是满的,那么这个单元的下一个状态也是满的,否则会是空的。图 1 显示了一个由三个满细胞的单元组成的简单模式在复制过程中的几个步骤。
图 1. 复制过程。
然而,一个 bug 已经蛰伏在工艺中了。在每次更新单元状态之后,网格中某一个单元的状态可能自动变化。例如,图 2 显示了可能的变化,其中一个细胞在第一次状态更新后出现了自动变化,另一个细胞在第三次状态更新后出现了自动变化。
图 2. 复制过程中的错误。该图对应样例输入 1。
很不幸,最初的细胞模式丢失了,只有(可能受到 bug 影响的)复制结果保留了下来。你能否编个程序确定可能的最小的非空的初始细胞模式来产生给定的最终模式呢?
\(n,\ m\leq300\)
首先考虑不会出 bug 时如何回退一次操作
记 \(f_{i,\ j}\) 为当前的细胞状态,若 \((i,\ j)\) 是满的则为 \(1\) ,否则为 \(0\) ; \(g_{i,\ j}\) 为这次操作前的状态
可以发现 \(f_{i,\ j}\) 是由与其在八个方向直接相连的格子和自己的 \(g_{i,\ j}\) 异或起来得到的,并且 \(g_{1,\ i}=g_{i,\ 1}=g_{n,\ i}=g_{i,\ m}=0\)
不妨从上往下,从左往右依次确定 \(g_{i,\ j}\) ,由 \(f_{i-1,\ j-1}\) 异或上与 \((i-1,\ j-1)\) 八相连的所有非 \((i,\ j)\) 的格子的 \(g\) 的值即可
考虑格子 \((x,\ y)\) 出现 bug 后对 \(g_{i,\ j}\) 的影响,即实际的 \(f_{x,\ y}=f_{x,\ y}'\oplus1\)
由于 \(g_{i,\ j}\) 的转移只会用到 \(f_{i-1,\ j-1}\) ,那么 \((x,\ y)\) 的 bug 对 \(g_{x,\ y},\ g_{x+1,\ y},\ g_{x,\ y+1}\) 是没有影响的(没有影响指的是用不同的 \(f\) 求出来的 \(g\) 的结果相同),而 \(g_{x+1,\ y+1}\) 的值会改变,根据转移, \(g_{x+1,\ y+2},\ g_{x+2,\ y+1},\ g_{x+2,\ y+2}\) 的值也会改变。而 \(g_{x+1,\ y+3}\) 的转移会涉及到两个会改变的 \(g\) 的值,因此其权值不会改变,同理 \(g_{x+2,\ y+3},\ g_{x+3,\ y+3},\ g_{x+3,\ y+2},\ g_{x+3,\ y+1}\) 也不会改变……
形象地,若 x
表示 \((x,\ y)\) , 0
表示这个位置的 \(g\) 不会改变, 1
表示这个位置会改变,那么有
x0000000
01101101
01101101
00000000
01101101
01101101
00000000
...
考虑如何求出 \((x,\ y)\) ,首先行号比 \(x\) 小的点和列号比 \(y\) 小的点不会受到 \(f_{x,\ y}\) 改变的影响(即 \(f_{i,\ j}\) 等于其八相连的格子和自己的 \(g\) 的异或),而 \((x,\ i),\ i>y\) 的点与 \((i,\ y),\ i>x\) 的点可能改变,因此找到所有受到影响的格子,分别求出这些格子中的横纵坐标最小值即可
确定了 \((x,\ y)\) 后再用新的 \(f\) 求一次 \(g\) ,若仍然存在不合法的格子,说明当前状态就是初始状态,否则继续递归
CF1051G Distinctification
对于 \(k\) 个二元组 \((a_i,\ b_i)\) ,你可以对它进行任意多次操作:
- 选择一个下标 \(i\) ,如果存在 \(i\neq j,\ a_i=a_j\) ,则将 \(a_i\) 增加 \(1\) ,花费代价 \(b_i\)
- 选择一个下标 \(i\) ,如果存在 \(a_i=a_j+1\) ,则将 \(a_i\) 减去 \(1\) ,花费代价 \(-b_i\)
定义 \(f(S)\) 为,进行若干次操作使得二元组集合 \(S\) 中的每个元素的 \(a_i\) 互不相同,所需的最小代价
给定 \((a_1,\ b_1),\ (a_2,\ b_2),\ \cdots (a_n,\ b_n)\) ,对 \(1\leq k\leq n\) 求出, \(f(S=\{(a_1,\ b_1),\ (a_2,\ b_2),\ \cdots,\ (a_k,\ b_k)\})\)
保证 \(b_i\) 是 \(1,\ 2,\ \cdots,\ n\) 的排列
\(1\leq n,\ a_i\leq2\times10^5\)
考虑求单个集合的答案 \(f(S)\)
若 \(a_i\) 互不相同,可以发现答案会由 \(a_i\) 相邻的所有元素构成的连续段独立地构成
而对于每个 \(a_i\) 连续段,可以发现在最优决策下我们会将这一段按 \(b_i\) 降序排序,每次操作即为冒泡排序的过程
若 \(a_i\) 可以相同,对于每个连续段,其左端点 \(l\) 必然不会改变,而右端点是 \(l+\text{连续段内二元组个数}-1\) ,我们成这段区间为该连续段的实际控制区间。如果有两个连续段的实际控制区间相邻或相交,可以发现我们能将它们合并为一个连续段
对于 \((a_i,\ b_i)\) ,若其所在连续段的实际控制区间的左端点为 \(l\) ,则该点对的贡献为 \((rk(b_i)-(a_i-l))\times b_i\) ,其中 \(rk(b_i)\) 为该连续段中 \(b_j>b_i\) 的 \(j\) 的个数
将式子拆开,只需要维护 \(rk(b_i)b_i-a_ib_i+lb_i\) ,用线段树合并维护即可,时间复杂度 \(O(n\log n)\)
auoj836
定义字符串 \(S\) 的子串自动机为满足如下条件的有向图:
字符串 \(S\) 的每个本质不同子串都对应图上一个节点,子串 \(x\) 对应的节点向字串 \(y\) 对应的节点有一条有向边当且仅当 \(|x|=|y|+1\) ,且 \(y\) 是 \(x\) 的子串
给定串 \(S\) ,求 \(S\) 的子串自动机上从 \(S\) 对应的节点出发的简单路径条数 \(\bmod 998244353\)
\(n\leq5\times10^5\)
若子串 \(x\) 的 border 长度 \(=|x|\) ,在 \(|x|>1\) 时只有唯一的出边,我们称这种 \(x\) 对应的节点为终止节点
可以发现对于非终止节点 \(x=S[l,\ r]\) ,以其为终点的方案数为 \(\displaystyle\binom{l-1+n-r}{l-1}\) ,因为一条连接非终止节点的边 \(y\to z\) 相当于删掉 \(y\) 的开头或结尾,而这个组合数就代表从 \(S\) 的某种删开头或结尾的顺序
对于终止节点 \(x\) ,它可以转移到 \(|y|=|x|-1\) 的终止节点,它也可以从某些非终止节点转移过来,对每种字母按长度降序做一遍 dp 即可