2026.6 杂题
Gym 104337B Mode
我们发现我们并不关心到底是哪个数字是众数,所以考虑记 \(b_i\) 表示出现 \(i\) 次的数字个数,那么有:
- \(\sum b_i=10\)
- \(\sum i\times b_i\le 18\)
我们把所有的 \(b_i\) 搜出来,发现只有 \(d=1477\) 种。
考虑求出 \(\le x\) 的答案时,枚举一个高位前缀和 \(x\) 相同,然后下一位填一个比 \(x\) 这一位小的数,然后我们可以算出这个前缀的 \(b\) 的状态 \(A\),然后后面每填的位是随便填的,所以再枚举填完所有位置后的状态 \(B\),那么对答案的贡献就是终止状态的众数出现次数乘上从 \(A\) 填到 \(B\) 的方案数。
这个从 \(A\) 填到 \(B\) 的方案数需要预处理出来,时间复杂度为 \(O(10d^2)\)。
处理完一个前缀与 \(x\) 相同的情况后还要考虑全部都不相同且存在前导 \(0\) 的情况。此时先枚举终止状态 \(S\),需要满足这个终止状态的 \(\sum i\times b_i<x\) 的位数,然后贡献就是从 \(\{0,1,0,0,0....0\}\to S\) 的方案数乘上 \(9\) (这一位填的是什么数)。
总时间复杂度为 \(O(10d^2+10Td\log_{10}n)\)。
QOJ 2603 Disbalance
题意是有 \(n\) 个变量,初始全为 \(1\),进行 \(K\) 次操作,每一次操作以 \(\frac{a_i}{\sum_{j=1}^n a_j}\) 的概率让 \(a_i\gets a_i+1\)。设最大值为 \(a_x\),则定义复杂度为 \(\max(0,a_x-\sum_{i=1,i\neq x}^na_i)\) ,求出 \(K\) 次操作后复杂度之和的期望大小。
注意到这里和的期望可以考虑计算出所有每一次操作完后的状态的概率(到达这个状态的方案数除以总方案数)乘上他的复杂度求出。所以直接开始计算方案数:
我们先考虑现在操作完了 \(k\) 步,到达状态 \(\{a_1,a_2,...,a_n\}\),我们该如何计算到达它的方案数。首先计算每一步的概率,第 \(i\) 步增加 \(a_x\) 的概率是 \(\frac{a_x}{n+i-1}\),那么我们发现无论我们以什么顺序去增加,每一步概率的乘积都是 \(\frac{(n-1)!\prod_{i=1}^n(a_i-1)!}{(n+k-1)!}\) 。现在的区别在于每一步的顺序,我们发现就是一个多重集顺序问题,答案是 \(\frac{k!}{\prod_{i=1}^n(a_i-1)!}\) 。我们把这两个式子乘起来就是到达它的概率了,发现有很大一坨可以被消掉,所以就是 \(\frac{(n-1)!k!}{(n+k-1)!}\)。
接下来考虑枚举最大值的大小 \(i\),满足 \(\lceil\frac{n+k}{2}\rceil\le i\le k+1\),这个位置有 \(n\) 种选择,复杂度是 \(2i-n-k\)。考虑剩下的位置怎么填,我们发现不用担心填的数超过最大值,因为 \(i\) 已经超过剩下所有数的大小了。剩下的数的和是 \(n+k-i\),有 \(n-1\) 个位置,每个位置都 \(\ge 1\),所以为了方便,我们把所有的 \(a_i\) 减一,这样剩下的数的和是 \(k-i+1\),每个位置都 \(\ge 1\),这是一个经典的组合数问题,用插板法可以算出答案为 \({k-i+1+n-2\choose n-2}\)。
然后就可以写出以下式子,则操作完 \(k\) 步后的期望复杂度为:
这样就可以 \(O(K^2)\) 计算出所有的 \(k\) 的答案。但是如何优化到 \(O(K)\)?
观察到后面的 \(\sum\) 里有很多的 \(k-i+1\),而且没有出现 \(k+i\) 的东西,所以考虑设 \(d=k-i+1\),然后把后面的式子写成只与 \(d\) 有关,不与 \(i,k\) 有关。所以要把 \(2i-n-k\) 换一下,因为 \(n,k\) 在这里为定值,所以可以写成 \((k+2-n)-2(k-i+1)\),这样前者为定值,后者只与 \(d\) 有关。所以式子可以进一步写成:
于是可以设:
\(f,g\) 都可以递推求出,只用预处理到 \(K+1\)。
则答案为:
综上可以 \(O(K)\) 计算。
CF321D Ciel and Flipboard
令 \(m=\frac{n+1}2\),定义一个操作矩阵的位置为其最左上角的点的坐标。观察到操作矩阵的位置只能在左上角的 \(m\times m\) 的矩阵里,如果位置为 \((i,j)\) 被修改了,就为 \(1\),否则为 \(0\),下文的异或和指的就是矩阵内操作次数的奇偶性。
我们先钦定所有位置未被修改,权值为 \(w_{i,j}\),如果要修改它,则答案增加 \(-2w_{i,j}\)。
对于原矩阵的任意一个位置 \((x,y)\),考虑操作矩阵的位置在哪里时会修改到它,我们把这个位置集合称为要求矩阵,那么当它的要求矩阵的异或和为 \(1\) 时它就被修改了,要加上 \(-2w_{i,j}\)。通过观察,我们发现这个要求矩阵一定包含这个 \(m\times m\) 矩阵的四个角中至少一个。记录 \(lu_{i,j},ru_{i,j},ld_{i,j},rd_{i,j}\) 分别为操作矩阵为这个 \(m\times m\) 的左上角、右上角、左下角、右下角且除了在这个 \(m\times m\) 矩阵的四个角以外的另一个端点在 \((i,j)\) 的 \(w\) 之和。
有一个很简单的 \(O(n^22^n)\) 做法就是先枚举每一行,然后枚举一个长为 \(m\) 的 \(0/1\) 集合 \(T\), \(T\) 的第 \(j\) 位为 \((1,1)\sim (i,j)\) 这个矩阵的异或和。那么此时我们再枚举长为 \(m\) 的 \(0/1\) 集合 \(S\),\(S\) 的第 \(j\) 位为 \((1,1)\sim (m,j)\) 这个矩阵的异或和。那么我们就可以计算出任意 \((i,j)\) 的 \((1,1)\sim (i,j), (1,j+1)\sim (i,m),(i+1,1)\sim(m,j),(i+1,j+1)\sim (m,m)\) 的异或和了,分别也是 \(lu_{i,j},ru_{i,j+1},ld_{i+1,j},rd_{i+1,j+1}\) 的系数。于是可以轻松计算出来。
但是这样还是过不了。
我们发现,如果我们枚举了 \(S\) 后,行与行之间是没有关联性的,考虑第 \(i\) 行,如果我们知道了 \((1,1)\sim (i,m)\) 和 \((1,1)\sim (i,j)\) 的操作奇偶性,就可以算出这一行所有 \((i,j)\) 的 \(lu_{i,j},ru_{i,j+1},ld_{i+1,j},rd_{i+1,j+1}\) 的贡献。于是枚举 \((1,1)\sim (i,m)\) 的异或和 \(k=0/1\),然后设 \(dp_{j,0/1}\) 表示考虑到第 \(i\) 行第 \(j\) 列时,\((1,1)\sim (i,j)\) 的异或和为 \(1\) 的最大收益。取 \(dp_{m,k}\) 更大的 \(k\) 就是第 \(i\) 行的收益。特别地,最后一行不用 \(dp\),可以通过 \(S\) 计算出确定的收益。把所有收益加起来就是 \(S\) 对应的收益。答案就是所有 \(S\) 中的最大收益。时间复杂度为 \(O(m^22^m)\)。
CF643D Bearish Fanpages
这种基环树的东西如果父亲修改时会影响儿子的值,就要考虑把所有儿子的信息记录在父亲身上。l
考虑设 \(x_u=\lfloor\frac{t_u}{ru_u+1}\rfloor\),同时设 \(calc(i)=t_i-ru_u\lfloor\frac{t_u}{ru_u+1}\rfloor\),记录 \(w_u=calc(u)+\sum_{v\to u}x_v\), \(w_u\) 可以帮助我们求出 \(u\) 的值。
我们考虑如何快速求出所有点的值的最大值最小值,我们发现 \(u\) 的所有儿子的值都与 \(x_u\) 有关,若 \(x_u\) 被修改则都会被修改,不妨我们把所有的儿子的 \(w\) 值都记录在 \(u\) 处的一个 multiset \(p_u\) 里,这样直接取出最大和最小的 \(w_v\) 再加上 \(x_u\) 就是 \(v\) 的真实权值了。
考虑修改,设 \(u\) 的父亲为 \(f_u\),那么我们把 \(u\) 重新连向 \(v\) 会影响到的节点有哪些呢?先考虑 \(x\),发现 \(u\) 的度数没变,所以不会被影响,只有 \(f_u\) 和 \(v\) 的 \(x\) 会变。那么这两个的 \(x\) 变了,\(w_{f_{f_u}}\) 和 \(w_{f_v}\) 就会变,然后这两个点的父亲的 \(p\) 才会变。于是最多修改的点是 \(O(1)\) 个的。
用 set 去维护每一条边,这样做就是 \(O((n+q)\log n)\)。
CF674G Choosing Ads
注意到 \(20\le p\)。考虑 \(p=50+\epsilon\) 时改怎么做。此时找到众数就可以了,于是考虑每一次删去两个不同的数,直到不能删为止,最后剩下的一定全是这个众数,输出即可。
那么 \(20\le p\) 时,记录 \(k=\lfloor\frac{100}p\rfloor+1\),每一次删去 \(k\) 个不同的数,直到不能删为止,此时剩下的一定全部是超过 \(p\%\) 的数。所以用线段树去维护该区间内删到不能删为止时剩下的 \(k-1\) 种不同的数。然后合并可以做到 \(O(k^2)\)。
综上,可以在 \(O((n+q)k^2\log n)\) 内解决。
AT_arc101_d Robots and Exits
这个题是不是简单完了。
将两个相邻的出口的中间的机器人视为一段,先扔掉在第一个出口前和最后一个出口后的机器人,它们的出口是一定的。然后每一段的机器人只能选择走这一段左或右的出口出去。
显然每一段的机器人的一个前缀是从左边出去的,剩下的一个后缀是从右边出去。
然后考虑不同段之间的两个机器人在什么情况下是有解的。设现在有机器人 \(i,j\),设 \(l_i,l_j\) 为机器人 \(i,j\) 距离它们左侧第一个出口的距离,\(r_i,r_j\) 为右侧的。不妨设 \(i\) 从左边出去,\(j\) 从右边出去,那么一定有 \(l_i<l_j\) 或 \(r_i>r_j\),分别对应先把 \(i\) 送出去和先把 \(j\) 送出去,否则一定无解。
再考虑多个段之间,可以证明出来若任意两个 \(i,j\) 其中 \(i\) 向左,\(j\) 向右满足这个条件就一定合法。
我们发现一开始给的一个段内的限制也满足这个要求,所以就可以不管了。于是问题变成:有 \(n\) 对数 \(l_i,r_i\),选择其中的一些,满足对于任意一个被选择的 \(i\) 和一个未被选择的 \(j\) 都满足 \(l_i<l_j\) 或 \(r_i>r_j\),求出选择的方案数。
考虑按 \(l_i\) 从大到小排序,若 \(l_i\) 相同则按 \(r\) 从小到大排序。若两个位置的 \(l,r\) 都相同,那么它们被取的状态一定一样,所以可以删掉重复的。
然后设 \(dp_{i,j}\) 表示考虑到了第 \(i\) 个数对,前面选择了的数对的 \(r\) 最小值为 \(j\) 的方案数,考虑转移:
-
若选择第 \(i\) 个数对,则 \(dp_{i-1,j}\to dp_{i,\min(j,r_i)}\)。
-
若不选择第 \(i\) 个数对,则有:
$$dp_{i,j}=\begin{cases}dp_{i-1,j}&j>r_i\0&j\le r_i\end{cases}$$
放在数轴上发现就是把 \([j+1,+\infin]\) 的 \(dp\) 值之和加在 \(j\) 处,其他都不变。于是就很简单了,用线段树和树状数组维护,时间复杂度 \(O(n\log n)\)。
Gym101510D Drama
组合意义天地灭!
简单转化一下题意:就是有一个长为 \(h\) 的整数数组 \(\{a_1,a_2,...,a_h\}\),存在一个 \(d\) 使得 \(\forall i\in[1,d],a_i>0\),\(\forall i\in(d,n],a_i=0\),若满足 \(\sum_{i=1}^ha_i=n\) 则它的权值为 \(\prod_{i=1}^{x-1}(a_i-a_{i+1})\),否则权值为 \(0\)。求出所有这样的数组的权值之和。
因为权值和 \(a_i-a_{i+1}\) 有关,所以设 \(x_i=a_i-a_{i+1}\)。那么转化一下,就是存在一个 \(d\) 使得 \(\forall i\in[1,d],x_i>0\),\(\forall i\in(d,n],x_i=0\) ,若满足 \(\sum_{i=1}^h i\times x_i=h\) 则它的权值为 \(\prod_{i=1}^{d-1}x_i\),否则权值为 \(0\)。求出所有这样的数组的权值之和。
可以发现 \(d\le \min(h,\sqrt{2n})\),因为 \(\forall i\in[1,d],x_i>0\),所以此时 \(\sum_{i=1}^hi\times x_i\) 至少是 \(\sum_{i=1}^di=\frac{d(d+1)}2\le n\),那么 \(d\le \sqrt {2n}\)。
所以不难设出 \(dp\) 状态:\(dp_{i,j}\) 表示已经确定了 \(x_i\sim x_h\),且 \(\sum_{k=i}^h k\times h_k=j\) 的权值和。考虑转移,枚举 \(x_i\) 的值,则有:
这样做是无法通过的,我们希望时间复杂度做到 \(O(n\sqrt n)\),那么对于一个 \(i\) 的转移就要做到 \(O(n)\),但这里是 \(O(\frac{n^2}i)\) 的,如何优化?
考虑组合意义。考虑这个 \(dp\) 的含义,发现其实就是一个带权的完全背包,第 \(i\) 种物品的体积是 \(i\),如果选了 \(k\) 个该种物品,则权值总和要乘上 \(k\)。考虑组合意义,就相当于从取的这种物品里选择一个的方案数。
设 \(f_{j,0/1}\) 表示完全背包中当前的体积和为 \(j\),没有/已经选择了第 \(i\) 种物品中的一个的权值和。初始时 \(f_{j,0}=dp_{i+1,j},f_{j,1}=0\),则有以下转移:
然后更新新的 \(dp_{i,j}=f_{j,1}\)。于是单层的转移就变成了完全背包的复杂度,为 \(O(n)\)。总时间复杂度为 \(O(n\sqrt n)\)。

浙公网安备 33010602011771号