杂题 202510

数论

写了有几道比较深刻的,题解晚点。

20251010 概率期望

比较简单。

收集邮票

求的是停时的前缀和:

\[E(\frac{1}{2}(1+T)T) = \frac{1}{2}(E(T)+E(T^2)) \]

\(f_i\) 为收集到 \(i\) 个邮票,剩下时间的 \(E(T^2)\)\(g_i\) 为收集到 \(i\) 个邮票时剩下时间的 \(E(T)\)

\[g_i=\frac{i}{n}(g_{i}+1)+\frac{n-i}{n}(g_{i+1}+1)\\ g_i=g_{i+1}+\frac{n}{n-i}\\ f_i=f_{i+1}+\frac{2n}{n-i}g_{i+1}+\frac{3ni-i^2}{(n-i)^2}+1\\ \]

递推。

Random Student ID

计算每个人前面期望有多少人。

摊贡献考虑 \(i\)\(j\) 前的概率。

那就是 lcp 后第一个字符比较。

有很多字符串要考虑 lcp,所以上 trie。

然后扫 trie,枚举所有前缀当作 lcp。枚举 26 种字符比较即可。

Black Jack

考虑到 \(i\) 的概率:

\[f_{i}=\frac{1}{D}\sum_{j=1}^{D}f_{i-j} \]

然后是庄家,就多了一个 \(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_{i,j} \to f_{i+1,j}\\ f_{i,j} \to f_{i+1,i}\\ (c-2)f_{i,j} \to f_{i+1,i} (j \leq i-k) \]

初值就是 \(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 一下:

\[F_i[j] = \sum_{k} (-1)^{|j \wedge k|} f_i[k] = \sum_{k} (-1)^{|j \wedge a_{i,k}|}d_k \]

此时直接做是 \(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_{j,T}=\sum_{S}(-1)^{|T \wedge S|}c_{j,S} \]

然后就是要给 \(v\) 找一个解释了。我们可以顺着这个式子进行变换:

\[v_{j,T}=\sum_{S}(-1)^{|T \wedge S|}\sum_{i} \prod_{k} [|j \wedge a_{i,k}| = S_k]\\ v_{j,T}=\sum_{i}\sum_{S}(-1)^{|T \wedge S|} \prod_{k} [|j \wedge a_{i,k}| = S_k]\\ v_{j,T}=\sum_{i}\sum_{S}\prod_{k} (-1)^{T_k \wedge S_k}[|j \wedge a_{i,k}| = S_k]\\ v_{j,T}=\sum_{i}\prod_{k} (-1)^{T_k \wedge (|j \wedge a_{i,k}|)}\\ v_{j,T}=\sum_{i}\prod_{k \in T} (-1)^{|j \wedge a_{i,k}|}\\ v_{j,T}=\sum_{i} (-1)^{\sum_{k \in T}|j \wedge a_{i,k}|}\\ v_{j,T}=\sum_{i} (-1)^{|j \wedge (\bigoplus_{k \in T}a_{i,k})|}\\ \]

不妨记 \(z_{i,T}=\bigoplus_{k \in T}a_{i,k}\)

\[v_{j,T}=\sum_{i} (-1)^{|j \wedge z_{i,T}|}\\ v_{j,T}=FWT(\sum_{i} x^{z_{i,T}})[j]\\ \]

这里我们发现,只要每个 \(T\)\(\sum_i x^{z_{i,T}}\) 求一次 FWT 我们就可以计算出所有的 \(v\) 了。

然后来考虑解方程 \(\{v_{j,T}=\sum_{S}(-1)^{|T \wedge S|}c_{j,S}\}\)。这其实也是一个 FWT 的形式。具体的:

\[v_{j,T}=FWT(\sum c_{j,S}x^{S})[T] \]

对于每个 \(j\) 做一次 IFWT 就可以求出全体 \(c\) 了。

最终,我们在:

\[\boxed{ O(\red{n2^m+k2^{m+k}}+\green{m2^{k+m}}+\blue{m2^m+2^{k+m}\log{n}}) } \]

解决了这个问题。

回到本题,是 \(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\) 也是叶子。

应该差不多

posted @ 2025-10-16 21:15  Aysct  阅读(7)  评论(0)    收藏  举报