7 月记录
随机树生成器(tree)
先使用矩阵树定理求出初始有 \(i\) 条 \(1\) 边 \(j\) 条 \(2\) 边的生成树个数,具体就是二维拉格朗日插值。
然后对每个 \(p_{x,y}\) 的所有边算最终去向,得到 \(f_{i,j}\) 表示最终生成树上有 \(i\) 条边 \(+1\),\(j\) 条边 \(+2\),最后的贡献之和,这个背包容易做。
最后算满足 \(i\) 条边加一,\(j\) 条边 \(+2\),其他边不限制的操作序列方案数。
使用 EGF
,记其关于 \(t\) 的 EGF
为 \(F_{i,j}(t)=G_0^{n-1-i-j}(t)G_1^i(t)G_2^j(t)e^{\binom{n-1}{2}t}\),其中 \(G_k(x)=\sum\limits_{i\ge 0} \dfrac{x^i}{i!}[i\bmod 3=k]\)。
由单位根反演可求出各 \(G\) 的封闭形式:
- \(G_0(x):\dfrac{1}{3}(e^{wx}+e^{(-1-w)x}+e^x)\)
- \(G_1(x):\dfrac{1}{3}((-1-w)e^{wx}+we^{(-1-w)x}+e^x)\)
- \(G_2(x):\dfrac{1}{3}(we^{wx}+(-1-w)e^{(-1-w)x}+e^x)\)
其中 \(w\) 为三次单位根,在本题模数下其存在模意义下的值,注意 \(-1-w=w^2\)。
最终为 \(\sum e^{(aw+b)t}g_{a,b}\),并且不同的 \((a,b)\) 仅有 \(O(n^2)\) 个,也就是单次询问只需要 \(O(n^2)\) 次快速幂即可,这可以使用光速幂优化 \(O(n^2)\)。
Legendary Train
将两种人按照时间排序,每个时刻完成的一定是两种人的前缀,且时间为某个人的 \(t\) 加上 \(kT\),这时候的 dp
值仅为 \(01\)。
不难发现 dp
值为 \(1\) 的只有最小的 \(k\) 有用,则将 \(k\) 计入状态。
再发现“某个人”一定是两种人最后完成的人之一。
网格计数(grid)
有点妙!
考虑优化,直接记录做了 \(i\) 行后出现 \(j\) 个本质不同的状态,且最后一行每个状态的值为 \(s\)。
则之前 \(s\) 的每位的数都可以选择变为 \(0/1/01\) 之一,要求为最左的发生改变的应该是 \(0\to 1\) 或 \(0\to 01\)。
现在可以做到 \(\mathcal O(n^22^n)\)。
考虑不记录 \(s\),转而考虑当前第一个字符对之后所有操作的影响。
设计状态 \(f_{x,0/1/01,len,len1}\) 表示初始有一个串,串长为 \(len+1\),已知其第一次操作首位变为 \(0/1/01\),且第一次操作无需考虑限制(但是后面的操作需要考虑),最后生成长度为 \(len1\) 的 \(s\) 的方案数。
发现可以转移!!!
若首位变为 \(1\),则之后不会有变化,进而枚举第二位的状态去转移,因为第一次操作依旧无需考虑限制。
若首位变为 \(0\),则:
- 之后无变化,同上。
- 之后某次操作变为 \(1\),则前 \(p-1\) 次操作无变化,同上;发现后 \(x-p+1\) 次操作中第一次操作依旧是钦定首位变成什么,然后无限制,所以还是 \(f\),故可以枚举 \(p\) 以及中间长度进行转移。
- 之后某次操作变为 \(01\),同上。
若首位变为 \(01\),同上。
本质是通过钦定首位始终不变,达到去除首位的目的;然后在首位变化的时候,第一次操作已经满足了,所有就是一个子状态的 \(f\)。
时间复杂度 \(\mathcal O(n^5)\)。
苦痛之路(pain)
条件可以变为 \(\gcd(a_i)=1\) 且 \(\gcd(\frac{n}{a_i})=1\)。
莫反成 \(p_1p_2\),且 \(\mu(p_1)\ne 0,\mu(p_2)\ne 0\),则合法 \(p_1p_2\) 的指数 \(\le 3\),且系数可以简单统计。
注意到答案只和 \(n\) 的指数序列有关,记忆化即可。
丝之歌(silksong)
考虑折半分成两个集合 \(S,T\),求出每个集合的点集恰好为 \(X\) 的边集数量 \(f_X\)。
然后枚举中间边的集合即可合并。
时间复杂度为 \(\mathcal O(|S|2^{|S|}+|T|2^{|T|}+2^{P(S,T)})\)。
发现随机化可以取到较优的划分。
P13275 [NOI2025] 集合
考虑容斥 \(f(P)=f(Q)\)。
记 \(W_{X,Y}\) 表示 \(X\subseteq f(P),Y\subseteq f(Q)\) 的方案数,则 \(W_{X,Y}=\prod_{X\subseteq S}(1+a_S)\prod_{Y\subseteq S}(1+a_S)\prod_{X\subseteq S,Y\subseteq S}\frac{(1+2a_S)}{(1+a_S)^2}\)。
设 \(F(X)=\prod_{X\subseteq S}(1+a_S),G(X)=\prod_{X\subseteq S}\frac{(1+2a_S)}{(1+a_S)^2}\),则 \(W_{X,Y}=F(X)F(Y)G(X\cup Y)\)。
然后考虑子集反演,直接求其对答案 \(w_{S,S}\) 的贡献,则系数为 \((-1)^{|X-S|+|Y-S|}=(-1)^{|X|+|Y|-2|S|}=(-1)^{|X|+|Y|}\),且共有 \(2^{|X\cap Y|}\) 个被贡献到了。
由于上面的是 \(\cup\),但是下面的是 \(\cap\),考虑 \((-1)^{|X|+|Y|}2^{|X\cap Y|}=(-1)^{|X|+|Y|}2^{|X|+|Y|-|X\cup Y|}=(-2)^{|X|}(-2)^{|Y|}\frac{1}{2}^{|X\cup Y|}\)。
然后就能做到 \(\mathcal O(n2^n)\) 了。
现在考虑无逆元的问题,设 \(a_i=-1\) 的系数为 \(x\),则最后答案分子分母都是一个多项式,要求 \(\lim_{x\to 0}\frac{f(x)}{g(x)}\),维护最低次项即可。
附魔
666。
记 \(p_n\) 为 \(n\) 的划分数,则数字 \(i\) 出现至少 \(k\) 次的划分数为 \(p_{n-ik}\),答案为 \(\sum_{i=l}^{r}p_{n-ik}\)。
记 \(f_{i,j}\) 表示 \(i\) 个数,和为 \(j\) 的划分数,且只选择 \([l,r]\) 之间的数。
于是根号分治,\(\le \sqrt n\) 的暴力即可。
时间复杂度 \(\mathcal O(n\sqrt n)\)。
P13497 【MX-X14-T7】墓碑密码
记 \(h_i\) 表示 \(s\) 子集大小为 \(i\) 且合法个数,则答案为 \(\sum_{i\ge 0}h_i\binom{\lfloor\frac{n-i}{2}\rfloor+|S|}{|S|}\)。
\(h\) 的生成函数为 \(\sum_{a\in T} [x^a]\prod_{b\in S}(1+x^by)\)。
考虑先对异或维 FWT
:
然后 IFWT
回去:
则 \(h\) 为:
记 \(ca_j=\sum_{a\in T}[|a\cap j|\bmod 2=1],cb_j=\sum_{b\in S}[|b\cap j|\bmod 2=1]\),则为:
合并系数,得到:
就能 \(\mathcal O(S^2)\) 求了。
然后考虑如何快速算 \(ca_j,cb_j\),考虑将所有 \(|a\cap j| \bmod 2\) 压到 bitset
里,每次 \(j\leftarrow j+1\) 相当于翻转一段后缀,我们预处理出每种长度的后缀对 bitset
造成的影响,每次异或一下再调用 count()
即可做到 \(\mathcal O(\frac{2^v |T|}{\omega})\)。
总时间复杂度为 \(\mathcal O(|S|^2+\frac{2^v|T|}{\omega}+q|S|)\)。
CF2128F Strict Triangle
考虑一条最短路 \(P\),将最短路上的边减小,其他边增大,依旧合法。
故最短路上为 \(L_i\),其他边为 \(R_i\)。
考虑去除“最短路”的限制,只要钦定任意一条路径上全选 \(L_i\),其他全选 \(R_i\),且这条路径 \(<dis(1,k)+dis(k,n)\)。
考虑合法的等价条件,即设 \(u,v\) 分别是 \(dis(1,k)\) 在 \(P\) 上的最后一个点、\(dis(k,n)\) 在 \(P\) 上的最后一个点,则 \(dis_L(u,v)<dis_R(u,k)+dis_R(v,k)\)。
这个限制太紧了,考虑必要条件 \(\forall (u,v)\in P,dis_L(u,v)<dis_R(u,k)+dis_R(v,k)\)。
于是上面的就是宽松的充要条件。
移项,得到 \(dis_R(v,k)>dis_L(u,v)-dis_R(u,k)\)。
考虑最短路处理,对于一条结尾为 \(p\) 的路径,容易求出 \(dis_L(u,v)-dis_R(u,k)\) 的最大值,使用最短路求其最小值即可。
CF2129D
首先发现 \(s_i\) 级别是 \(\mathcal O(\log n)\) 的。
考虑区间 dp
,设 \(f_{l,r,a,b}\) 表示考虑区间 \([l,r]\) 的数,且 \(a_{l-1},a_{r+1}\) 已经出现,截住所有要往外的贡献,给 \(s_{l-1}\) 加 \(a\),给 \(s_{r+1}\) 加 \(b\) 的方案数。
考虑枚举第一次出现的位置 \(m\),则能确定分别给左右加了多少,然后从 \(f_{l,m-1,a,b},f_{m+1,r,c,d}\) 转移,条件为 \(b+c=s_m\)。
这是个逆向的过程,如果你再反过来想,就是从初始区间,枚举第一次出现的位置,要求左右区间满足条件,且钦定分别给左右贡献多少。
CF2124G Maximise Sum
显然 \(i\) 在前缀最小值上,\(j\) 在后缀最大值上。
则修改完 \(a_i\) 后 \(pre_i'\in[a_i+1,pre_{i-1}]\),这个总和是 \(\mathcal O(n)\) 的,枚举这个值,可行的后缀最大值 \(j\) 满足 \(a_j+a_i\ge pre_i'\),只有 \(\mathcal O(n)\) 对。
然后这个修改后的计算,慢慢优化就行了。
魔法
另一个做法。
考虑不用经典的“钦定经过的第一个关键点”的容斥,而使用对钦定经过关键点的个数进行容斥,即普通的二项式反演。
设 \(f_{i,j,0/1}\) 表示起点为 \(i\),当前走到 \(j\) 的所有路径,钦定经过的关键点个数的奇偶性。
然后发现可以优化一维!!
P13560 【MX-X15-T7】交换换
先写一些 border
理论。
若 \(0< r < |S|,pre(s,r)=suf(s,r)\),则 \(r\) 为 \(s\) 的 border
。
若 \(0<p<|S|,s_i=s_{i+p},\forall i\in[1,|S|-p]\),则 \(p\) 为 \(s\) 的一个周期。
定理一:\(Bd(S)=mxBd(S)+Bd(mxBd(s))\)
即 border
的 border
是 border
。
border
与周期一一对应。
**两个前缀的最长公共 border
即为 LCA。
定理二:弱周期定理
若 \(p,q\) 为 \(S\) 周期,且 \(p+q\le |S|\),则 \(\gcd(p,q)\) 也是 \(S\) 的周期。
证明:
不妨设 \(p>q,d=p-q\),以下证明 \(d\) 也是 \(S\) 的周期。
当 \(i>q\) 时,有 \(s_i=s_{i-q}=s_{i-q+p}=s_{i+d}\)。
当 \(i+p\le |S|\) 时,有 \(s_i=s_{i+p}=s_{i+p-q}=s_{i+d}\)。
以上情况,包含所有 \(i\in [1,|S|-d]\),所以得证,辗转相除即可。
强化版:\(p+q-\gcd(p,q)\le n \to \gcd(p,q)\) 为 \(S\) 周期。
先告一段落,来看这题。
如何判断一个 \(S\) 是否是好的,则运用弱周期定理:不断合并 \(S\) 中最小两个数 \(a,b\) 为 \(\gcd(a,b)\),直到 \(a+b>n\),则 \(b>\frac{n}{2}\)。
我们可以将 \(i\in[n-b+1,n]\) 的数与 \(i-b\) 合并,变成规模为 \(n-b\) 的子问题,暴力连 \(a,b\) 的边,原来 \(>b\) 的边 \(c\) 变为 \(c-b\)。
咕咕咕咕。
CF1764H Doremy's Paint 2
断环成链。
考虑从后往前扫,维护每个位置的颜色被彻底消除的时刻 \(f_i\),当他被设成其他位置了就视为消除。
考虑从后往前到 \(t\) 时刻,操作 \([l,r]\),则有:
- \(f_l\leftarrow \max_{i=l}^{r}f_i\)。
- \(\forall i\in(l,r],f_i\leftarrow t\)。
则答案就是倒着做到 \(x\) 后,\(n-\sum[f_i\le x+k-1]\)。
考虑这个是区间覆盖,单点覆盖,odt
维护即可,贡献树状数组维护。
时间复杂度 \(\mathcal O(n\log n)\)。
与 UNR #8 兵棋 类似,递推求出每个位置的贡献存在的时间。
P11989 [JOIST 2025] 勇者比太郎 3 / Bitaro the Brave 3
JOI 喜欢出二分图匹配?
考虑怪有 \(l\times H_i\) 个,连向后缀 \(S_i\) 的时间,每条边的权值为 \(P_i\),求二分图最大权匹配。
考虑 \(P_i=1\) 时,使用 hall
定理:\(\max_j \sum_i[s_i\ge j]-(T-j)\)。
这个二分图匹配和省集那题很像,如果单纯二分图最大匹配的话,任意加入,从前往后在值域上匹配。
但是现在带权,按照权值从大到小考虑,依旧从前往后在值域上匹配,能求出前缀最大匹配数量(也可以由贪心证明正确性),此时答案为 \(\sum P_i(t_i-t_{i-1})\),化简为 \(\sum t_i(P_i-P_{i+1})\)。
对每个 \(t_i\) 考虑,就相当于给出 \(x\),对若干 \((k,b)\) 求 \(\max kx+b\),作出上凸包,差分贡献答案。
最后询问时双指针即可。
P13535 [IOI 2025] 纪念品(souvenirs)
考虑设 \(solve(i, M)\) 表示已知 \(val_{i-1}>M\ge val_i\) 的情况下求 \(val_i,\cdots val_{N-1}\)。
假设返回了 \(\{id_1,id_2,\cdots,id_m\}\) 且 \(\sum val_{id_i}=C\),则一定有 \(val_{id_1}>\frac{C}{m}>val_{id_m}\)。
则直接询问 \(\frac{C}{m}\) 会得到某个以 \(j,id_1<j\le id_m\) 开头的序列,调用 \(solve(j,\frac{C}{m})\) 即可求出 \(val_{j},\cdots,val_{N-1}\)。
于是原来的问题就缩小成了一个前缀,对剩下的数继续询问平均数就能继续缩小,最后求出 \(id_1\),也就求出了所有 \(id_i\)。
然后扫前缀找到最后求出的数 \(v\) ,继续问 \(v-1\) 即可。
由于 \(solve(i,?)\) 只会对每个 \(i\) 问一次,故每个数个数是够的。
CF1737G *
CF2115F2 *
CF2125E
妙妙题。
考虑对于 \(Q\),找一个代表元 \(a\)。
结论:存在一个唯一的 \(a\),使得 \(\min(a)=1\) 且 \(>1\) 的数两两不同。
证明:
显然将重复的数全分成 \(1\) 不影响 \(Q\)。
将 \(a\) 所有数 \(-1\),则 \(Q\) 所有数减去 \(|Q|-1\)。
那么将 \(a\) 所有数减去 \(\min(a)-1\),则 \(Q\) 所有数减去 \((|Q|-1)(\min(a)-1)\)。
最后再加上 \((|Q|-1)(\min(a)-1)\) 个 \(1\)。
下面再证唯一性。
考虑先对任意 \(a\) 倒序排序去重得到 \(b_i\),则 \(Q_i=s-b_i\),有:
则 \(b\) 的差分数组的相反数就是 \(Q\) 的差分数组。
那么对于 \(Q\),且 \(\min(a)=1\),则根据上面的可以确定 \(a\) 中 \(>1\) 的所有数。
另外也可以知道 \(1\) 的个数,那么 \(a\) 就是唯一的。
考虑将 \(1\) 可以重复取去掉,对于一种元素两两不同且 \(\min =1\) 的序列 \(a\),和为 \(s\),那么可以对应 \(x-(s-1)+1\) 种 \(Q\)。
然后 \(Q_i\le x\) 的条件可以转化为 \(\sum a \le x+1\)。
然后 $\min (a)=1 $ 的条件可以考虑将所有 \(a\) 减一,就是求 \(n-1\) 个两两不同的数,和 \(\le x-n+1\)。
设 \(f_{i,j}\) 表示前 \(i\) 个数和为 \(j\) 的方案数,有转移:
- 将序列所有数加一,然后末尾加一个 \(1\)。
- 将序列所有数加一。
即 \(f_{i,j}=f_{i-1,j-i}+f_{i,j-i}\)。
根据经典结论 \(n\le \mathcal O(\sqrt x)\) 才有解。
时间复杂度 \(\mathcal O(x\sqrt x)\)。
P13687 【MX-X16-T5】「DLESS-3」XOR and Rockets
神秘。
考虑 \(a_n\) 不操作,则操作完的序列 \(a_i'\le a_n\),使用 dp
,记 \(f_{i,j}\) 表示 \(a_i'=j\) 的最优方案。
则转移为:
因为你若记录操作数是什么,你发现转移的区间得在二进制上刻画,所以不妨使用递增序列的形式刻画。
简单优化。
若 \(a_n\) 操作,则考虑每个操作的位置,人为地异或上 \(2^{100i}\),这样就变成了每一段要求是否存在 \(x\),满足 \((a_l\oplus x)\le (a_{l+1}\oplus x)\le \cdots \le (a_r\oplus x)\),且相邻段无需考虑。
玩玩二进制就能得到判断条件了。
P13688 【MX-X16-T6】「DLESS-3」XOR and Powerless Suffix Mode
你妈。
首先你要求一个子问题:
或者似乎写个按位考虑的做法也能优化。
然后后面的问题写个暴力出来就都能优化了。
出现次数相同的可以并在一起。
最后套个莫队就行了。
找所有出现过的出现次数的话,\(\le \sqrt n\) 的暴力,\(>\sqrt n\) 的就预处理原序列 \(>\sqrt n\) 的数记录前缀出现次数,处理的时候检查一下即可。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/19005075