杂题 202510
数论
写了有几道比较深刻的,题解晚点。
20251010 概率期望
比较简单。
收集邮票
求的是停时的前缀和:
记 \(f_i\) 为收集到 \(i\) 个邮票,剩下时间的 \(E(T^2)\),\(g_i\) 为收集到 \(i\) 个邮票时剩下时间的 \(E(T)\)。
递推。
Random Student ID
计算每个人前面期望有多少人。
摊贡献考虑 \(i\) 在 \(j\) 前的概率。
那就是 lcp 后第一个字符比较。
有很多字符串要考虑 lcp,所以上 trie。
然后扫 trie,枚举所有前缀当作 lcp。枚举 26 种字符比较即可。
Black Jack
考虑到 \(i\) 的概率:
然后是庄家,就多了一个 \(L\) 的限制,加一维 \(0/1\) 表示停不停。
然后计算胜率最高点就好了。是个前缀和问题。
还有几道写了,但……
DP 专题
标记 X 的是口胡的,还没写代码。
标记 * 的是之后要再回来看的。
CF1798E Multitest Generator (X)
首先考虑如果要修改第一位,那么我们可以根据 \(a_2\) 开始往后跳,直到某一个 \(b_k\) 比剩下数多时把 \(b_k\) 改成剩下数的个数。第一位可以修改所以一定是可以的。
于是操作不会超过 \(2\) 步。
于是先检查能不能 \(0\) 步。然后检查是否能只修改第一位。
主要的是能不能只修改一个非第一位。
考虑是一个拼接。设 \(f_i\) 表示 \(i\) 向后多少步跑完序列,跑不完就是 \(f_i=+\infty\)。
转移就是 \(f_i=f_{i+b_i}+1\)。
然后就是从 \(2\) 开始跳,每个点查看后面的 \(f\) 是否出现剩余次数即可。
然后是对于每个后缀的询问。\(0\) 步和只修改第一位也可以规约到 \(f\),查看 \(f_{i+1}\) 即可。
我们发现主要问题还是从第二个位置开始向后跳的过程。我们需要维护一些信息使得这个过程不需要一个个尝试。
注意到一个后缀中出现的值是连续的一个前缀,我们可以把剩余步数合法范围也进行转移。
设 \(g_i\) 表示走到 \(i\) 后剩余步数为 \([1,g_i]\) 是合法的。
\(g_i = \max(g_{i+b_i}+1,\max{f})\)
差不多就是这样。因为 \(i+b_i\) 处的合法步数在 \(i\) 都是合法的,相当于多了一个 \(g_{i+b_i}+1\)。
于是询问 \(g_{i+1}\) 即可确定这种情况。
CF2066C Bitwise Slides (x)
三个变量是不区分的。假设 \(P = Q\)。
假设操作 \(P\),则 \(P \oplus a_i = R \Leftrightarrow a_i = P \oplus R\),操作 \(Q\) 同理。
操作 \(R\) 就没啥限制。
所以其实我们只关注 \(P \oplus R\) 的值。
维护之。
操作 \(P,Q\) 是 \(O(1)\) 的转移,操作 \(R\) 是整体的变换。
不妨记 \(f_{i,j}\) 表示操作完前 \(i\) 个,\(P \oplus R = j \oplus (\bigoplus_{k=1}^{i} a_k)\) 的方案数。
行间转移是 \(O(1)\) 的。就是 \(O(n)\)。
*CF283D Cows and Cool Sequences (x)
先观察 \((x,y)\),要满足 \(x=\frac{(2d+y-1)y}{2}\)。
分离变量得到 \(\frac{2x}{y}-y=2d-1\)。也就是 \(\frac{2x}{y}-y\) 是奇数。
假设 \(n=2^{w_n}k_n\),则 \(2^{w_x-w_y+1}\frac{k_x}{k_y}-2^{w_y}k_y\)。
得到 \(k_y|k_x\),\(w_x+1=w_y \vee w_y=0\)
于是 DP 枚举不动点,假设 \(i\) 前面是 \(j\),首先 \(k_{a_i} | k_{a_j}\),然后 \(w_{a_j}+i-j=w_{a_i} \vee w_{a_i}=0\),直接 DP 即可。
CF1322D Reality Show (x)
考虑这个进位很麻烦,只能状压。但是我们可以丢弃更低位的内容,这样子进位信息就是 \(O(m)\) 级别的了。
为了维护当前位,一个思路是记录当前位数,但是这个是不可接受的。我们不妨钦定当前位置必选,当前位数就是 \(c_i\)。
转移就枚举 \(j>i\)。如果 \(c_i \neq c_j\) 就 \(f_{j,s} + w(\lfloor\frac{s}{2}\rfloor,1) \to f_{i,\lfloor\frac{s}{2}\rfloor+1}\)。否则 \(f_{j,s} + w(s,1) \to f_{i,s+1}\)。
预处理好 \(w(s)\) 就是 \(O(n^3)\)。
转移是比较简单的,考虑能不能优化转移。
转移顺序是个偏序关系,\(c_i \leq c_j,i<j\)。我们考虑扫描线维护 \(c\),也就是我们从小到大处理 \(c\)。
然后再倒着扫 \(i\),并且把后面的 \(j\) 加入(\(g_{\lfloor\frac{s}{2^c}\rfloor} = \max(f_{j,s},g_{\lfloor\frac{s}{2^c}\rfloor})\))。可以知道一个 \(i\) 只会加入 \(O(\log{m})\) 次,于是就是 \(O(nm\log{m})\) 的。
*CF431D Random Task (x)
注意到 \(n\) 时是 \(n+1,\cdots,2n\),\(n+1\) 时是 \(n+2,\cdots,2n,2n+1,2n+2\)。
\(|n+1|=|2(n+1)|=|2n+2|\),所以 \(n+1\) 的答案大于等于 \(n\) 的答案。
可以二分。剩下的数位 DP 乱搞。
CERC2017 Donut Drone (x)
看题知倍增。主要是还有修改,要考虑怎么做修改。
注意到 \(m\) 只有 \(5000\),估计和行有关。
考虑到横向移动是固定的,只有纵向移动不确定。
我们不妨维护出 \((x,0)\) 走 \(c\) 步后的位置。
对这 \(r\) 个位置维护倍增走 \(2^wc\) 步后走到的行。剩下不超过 \(c\) 步可以暴力走。
然后考虑怎么快速修改。我们发现两个起点的路径是不会产生交叉的,所以会到 \(i\) 的起点是一段区间。暴力走出从修改点到终点的路径,二分出被影响的区间,然后直接修改。
\(O(Q(c\log{r}+r\log{V}))\)
COCI 2020/2021 #3 Selotejp (x)
\(m\) 很小,显然是状压列表示列是否延伸胶带下来。
行间转移枚举子集 \(O(3^m)\) 枚举两个状态,\(O(m)\) 的判断要补多少横着的胶带就好。
\(O(n(m2^m+3^m))\)。
BalticOI 2020 村庄 (Day2) (x)
考虑最小,那就是一个简单的树形 DP。就是 \(f_{i,j}\) 表示子树里还有 \(j\) 个没有匹配。能匹配就尽量匹配,记录一下匹配了啥即可。
最大,就是 CF468D Tree 的弱化。
ABC050D Xor Sum
感觉就是数位 DP。
从最高位向下填并处理借位。记 \(f_{i,j}\) 表示 \(v\) 高 \(i\) 位全顶,有没有来自低位的进位,\(u\) 的方案数。\(g\) 同理但是已经小于 \(N\)。
每次就枚举是否向高位进位,低位是否进位,\(v\) 这一位的真实值即可。
ABC279G At Most 2 Colors
一个简单的想法是记录和当前颜色不同的上一个位置。
转移比较简单:
初值就是 \(f_{k,j}=c(c-1) (1 \leq j \leq k-1),f_{k,0}=c\)。
转移很有特征,除了自转移都是规约 \((i+1,i)\)。
所以行间转移可以借助线段树做到 \(O(\log{n})\)。
(这个好像听说是叫整体 DP 来着)
(我记得去年 CSP T3 是不是也差不多,我记得我写的也是这个套路只不过不用线段树)
其实改成维护前缀和即可去掉线段树。
LOJ#6373. NOIP2017 普及组题目大融合
咕咕咕。
20251014、16 杂题
写了代码的会标注 *。
LGP3488 [POI 2009] LYZ-Ice Skates
就是可以找到一个人和鞋的完美匹配。先判掉人比鞋多。
考虑 Hall 定理,要求对于任意一个人的子集 \(G\) 有 \(|G| \leq |\operatorname{tr}(G)|\),\(\operatorname{tr}(G)\) 是 \(G\) 的邻域。
一个直觉是,我们考虑 \(G\) 是连续的。
证明
考虑选出的“相邻”两个人,满足 \(x,y\) 之间还有人不选。如果 \(x<y \leq x+d\),那么选上中间的人是不劣的。
如果 \(x+d<y\),把 \(x\) 及其前的 \(|G_1|-|\operatorname{tr}(G_1)|\) 记作 \(d_1\),类似有 \(d_2\)。两部分不交。若 \(|G|-|\operatorname{tr}(G)|=d_1+d_2 > 0\),则必有至少一个 \(d\) 满足 \(>0\),删去一个部分是不劣的。
于是无解相当于 \(\sum_{i=x}^{y}v_i > k(y+d-x) \Rightarrow \sum_{i=x}^{y}(v_i-k) > k(d-1)\)。
于是就是要维护 \(v_i-k\) 的区间最大值。
直接上线段树。每个节点维护区间最大区间和,最大前缀和,最大后缀和。
LGP3767 魔法
相当于维护并查集,支持连边,删边,历史版本。
感觉可以 LCT
有删边经典做法是线段树分治。但是这里还有历史版本。
考虑历史版本是树形结构,一个加删影响一个子树。可以通过 DFN 序变为区间问题。
然后就没什么了。
*2019-2020 ICPC Asia Hong Kong Regional Contest I
二进制警报器大学习。我写了学习笔记啦!
P7907 Ynoi2005 rmscne
假设 \(C_{l,r}\) 表示区间 \([l,r]\) 的颜色集合。
考虑到一点:\(C_{l',r'} \subseteq C_{l,r}\),所以其实是要求 \(|C_{l,r}|=|C_{l',r'}|\)。
然后要求区间最小,其实就是不想要没用更新。记录最后更新的位置减区间下标就好。
于是我们考虑扫描线。每次相当于区间 \(C\) 加,区间等差数列赋值。
查询的话,\(C\) 有单调性,二分求出可用区间,然后区间 \(\min\)。
应该不难写。
(upd:被卡常了,但是不想调)
CF1119H Triple
直接考虑一个加强的问题吧。
给定 \((a_{i,j})|(1 \leq i \leq n,1 \leq j \leq m,0 \leq a \leq 2^k-1)\) 和 \(d_i|(1 \leq i \leq m)\),求 \(\prod_i (\sum_j d_j x^{a_{i,j}})\),其中 \(x\) 的乘法是异或卷积。
\(m\) 很小。满足 \(m < k \ll n\)。
记 \(f_i = \sum_j d_j x^{a_{i,j}}\),要求 \(g = \prod_i f_i\)。
考虑 FWT:\(F_i=FWT(f_i)\)。要求所有的 \(G[j]=\prod_i F_i[j]\)。
全部做 FWT 是 \(O(nk2^k)\),不现实。我们考虑手动 FWT 一下:
此时直接做是 \(O(nm2^k)\),略有优化但不够。
我们希望去掉 \(n\)。可以观察到对于确定的 \(j\) 而言,\(F_i[j]\) 的取值只有 \(O(2^m)\) 种(考察所有 \(d\) 前的符号)。
设 \(c_{j,S} = \sum_{i} \prod_{k} [|j \wedge a_{i,k}| = S_k]\),则 \(G[j]=\prod_S (\sum_k (-1)^{S_k} d_k)^{c_{j,S}}\)。
假设我们知道 \(c\),这样我们可以在 \(O(m2^m+2^{k+m}\log{n})\) 求得 \(G\),然后 \(O(k2^k)\) IFWT 得到 \(g\)。
现在考虑求 \(c\)。
然后是本题的神秘所在:我们构造 \(2^m\) 次方个和 \(c_j\) 有关的方程去把 \(c_j\) 解出来。
这里罗列一些性质:
\((-1)^k = (-1)^{k \bmod 2}\)
\(a,b \in {0,1}\),\(a \wedge b = ab \bmod 2\)
\(a,b \in {0,1}\),\(a \oplus b = (a+b) \bmod 2\)
\(a,b \in {0,1}\),\(a \wedge (b \oplus c) = ((a \wedge b) + (a \wedge c)) \bmod 2\)
\(|a \wedge (b \oplus c)| \equiv (|a \wedge b| + |a \wedge c|) \pmod 2\)
\((-1)^{|a \wedge b|}(-1)^{|a \wedge c|}=(-1)^{|a \wedge b|+|a \wedge c|} = (-1)^{|a \wedge (b \oplus c)|}\)
要构造 \(2^m\) 次方个和 \(c_j\) 有关的方程,可以想到是和 \(\{0,\cdots,m-1\}\) 的全体子集有关。
实际上,对于一个 \(T \subseteq \{0,\cdots,m-1\}\),我们是如此构造的:
然后就是要给 \(v\) 找一个解释了。我们可以顺着这个式子进行变换:
不妨记 \(z_{i,T}=\bigoplus_{k \in T}a_{i,k}\)。
这里我们发现,只要每个 \(T\) 对 \(\sum_i x^{z_{i,T}}\) 求一次 FWT 我们就可以计算出所有的 \(v\) 了。
然后来考虑解方程 \(\{v_{j,T}=\sum_{S}(-1)^{|T \wedge S|}c_{j,S}\}\)。这其实也是一个 FWT 的形式。具体的:
对于每个 \(j\) 做一次 IFWT 就可以求出全体 \(c\) 了。
最终,我们在:
解决了这个问题。
回到本题,是 \(m=3\) 时的特例。若将 \(m\) 以及 \(2^m\) 视为常数,则为 \(O(n+2^{k}(k+\log{n}))\)。
(事实上绿色部分我写了个 \(O(2^{k+2m})\) 的写法,相当于手动 IFWT,毕竟 \(m\) 很小。)
20251018 随机做题
P2664 树上游戏
考虑一种颜色的贡献。想在路径上经过的第一个位置统计这个颜色的贡献。
想到就是把连向这个颜色的边断了,然后从这个颜色的点出发的所有路径都有这个颜色,从其他颜色的点出发的跨连通块的路径都有这个颜色。
线段树分治+可撤销并查集+线段树就好了。
tag 好像是点分治。应该直接把点分树建出来,维护一个分治中心下到其他子树每种颜色的路径数就可以了。
CF53E Dead Ends
计数有 \(k\) 个叶子的生成树个数。先容斥一手变成钦定 \(k\) 个叶子的生成树个数。
看到 \(n\) 很小,考虑状压一层层往下推。设 \(f_{s,S}\) 表示已经扫到了 \(s\),目前最底层是 \(S\)。只能连边到底层。
无根树的话考虑 \(1\) 为根,特判 \(1\) 也是叶子。
应该差不多

浙公网安备 33010602011771号