260615

CF2042F Two Subarrays

CF2042F Two Subarrays。

错误思路

这道题如果从中间来思考做不出来。

首先是问题转化问题可以转化成先加上 al+⋯+ar+bl+bra_l+\cdots+a_r+b_l+b_r,然后需要加上 bx+by−(ax+1+⋯+ay−1)b_x+b_y-(a_{x+1}+\cdots+a_{y-1})。

对于 bb 我们很容易想到差分,也就是从原来的 2bx2b_x 一点点向右加 (by−by−1)−ay−1(b_y-b_{y-1})-a_{y-1},相当于我们需要维护区间最大值。

可以 dp:fi=max⁡(fi−1+ti,bi+bi−1)f_i=\max(f_{i-1}+t_i,b_i+b_{i-1}),然后一个点的情况单独计算。但是有 max⁡\max,没有办法快速维护。


这样不行的话,我们就从左右两个端点思考:

先考虑 cost(l,r)cost(l,r):sr+br−sl−1+bls_r+b_r-s_{l-1}+b_l。

然后我们设数组 Li=bi−si−1L_i=b_i-s_{i-1},Ri=si+biR_i=s_i+b_i。最后的答案就是求 i,j,x,yi,j,x,y 使得 Li+Rj+Lx+RyL_i+R_j+L_x+R_y 最大。

我们尝试用线段树维护,有亿点点复杂。

需要这些变量
  • L,RL,R 表示区间中最大的 LL 和 RR。

  • oneone 和 RLRL 表示一个和 RLRL 匹配。

  • ll,rrll,rr 表示缺少最后的 RR 和 LL。

  • ansans 表示最后的答案。

反正关键点就是类似线段树的 dp 形式左右区间的相互贡献加上原本的。


矩阵乘法也可以做

有点复杂,所以尝试换一种:

f1f_1 表示选了一个点,f2f_2 表示选了两个...

转移方程列出来之后就可以画矩阵了。

直接用 max⁡\max 的矩阵乘法维护。

CF1721F Matching Reduction

CF1721F Matching Reduction。

容易从最大匹配想到 König 定理,我们就把问题转化成了最小点覆盖大小减一。

CF2215D EXPloration, EXPloitation, and Gain Some EXPerience!

CF2215D EXPloration, EXPloitation, and Gain Some EXPerience!。

我们发现这道题 nn 很大,但是 mm 很小。我们的切入口应该是枚举 nn 操作 mm,但是显然不行,于是可以想到矩阵快速幂等东西来维护。

比较显然的问题转化是,我们需要保证相邻的列的区间 l,rl,r 有相交。

fi,l,r=1+∑fi+1,l′,r′f_{i,l,r}=1+\sum f_{i+1,l',r'}

然后用前缀和优化:

fi,l,r=1+sm−sl−1−tr+1f_{i,l,r}=1+s_m-s_{l-1}-t_{r+1}

接着我们需要压掉 ii 这一维。我们尝试直接转移 ss 和 tt。我们甚至还能发现这玩意儿是对称的,也就是 si=tm−i+1s_i=t_{m-i+1}。

然后我们放进矩阵考虑怎么转移。

si′=∑l=1i∑r=li(1+sm−sl−1−tr+1)s'_i = \sum_{l=1}^i \sum_{r=l}^i \big(1 + s_m - s_{l-1} - t_{r+1}\big) si′=i(i+1)2(sm+1)−∑l≤i−1(i−l)sl−∑r≤i+1(r−1)trs'_i = \frac{i(i+1)}{2}(s_m+1) - \sum_{l\le i-1} (i-l)s_l - \sum_{r\le i+1} (r-1)t_r

20260616

CF1559D2 Mocha and Diana (Hard Version)

CF1559D2 Mocha and Diana (Hard Version)。

首先肯定是贪心。我们先来看看怎么加最多的边,我们可以发现,最后如果两个都不是树,那么我们模拟一下,假如一个森林是两个连通块,那么这两个连通块任意两点间都需要联通,所以和另一个森林不是树矛盾。

所以我们可以得到结论:最后至少有一颗森林是树。

于是我们考虑求方案。

我们从最简单的考虑:对于一个点,我们能连就连。然后就会发现两个森林都可能有点和这个点没有连边,于是考虑处理一下。

我们发现这两个森林与选定的点在同一个连通块的点集可以相互连任意的边,因为连边了不会构成环。

AT_abc248_g [ABC248G] GCD cost on the tree

AT_abc248_g [ABC248G] GCD cost on the tree。

其实这种题是有套路成分的,我们先是按照 gcd⁡\gcd 来进行分类。

gig_i 表示是 ii 的倍数的时候的情况数,fif_i 表示是 ii 的时候的情况数。引入 gg 是因为我们无法只保留 ax=ia_x=i 的。

fi=gi−∑fix(x>1)f_i=g_i-\sum f_{ix}(x>1)

我们先想办法求 gg,先尝试只保留 x∣aix|a_i。

我们需要求出 ∑resi\sum res_i 表示当前点子树中所有的链长 >1>1 的长度和。然后过程中需要一些中间量辅助。

CF1635E Cars

CF1635E Cars。

只要是两者之一,就一定方向相异。如果无关紧要,就是背向而行,如果命中注定,就是相向而行的。

我们先钦定一个点的方向,然后与之相关的点看看放左边还是右边。

类似于 2-sat 的思想,我们对一个点建立两个点,一个表示向右走需要满足的条件,一个表示向左走需要满足的条件。

合法性可以先通过方向染色判断。

P7889 「MCOI-06」Eert Tuc Knil

P7889 「MCOI-06」Eert Tuc Knil。

注意这道题会有负数。

选含 uu 连通块总和: max⁡(val+x⋅sz)\max (val + x\cdot sz) 最优解形如 ans(u,x)=szux+valuans(u,x)=sz_u x + val_u。

我们需要考虑子块并入父亲的临界: tv=⌈−valvszv⌉t_v=\left\lceil \frac{-val_v}{sz_v} \right\rceil x≥tvx\ge t_v 一定会合并,并且不会再分开了。

所以我们询问按 xx 升序;单点初始为块,全部 tvt_v 丢小根堆。

遍历询问,弹出 tv≤xt_v\le x 的块,并查集合并到父块,重算新块阈值入堆。

DFS 序差分,树状数组子树查询得 szu,valusz_u,val_u,代入式子得答案。


注意:除法是向 00 取整,所以可以用 ceil。

CF868F Yet Another Minimization Problem

CF868F Yet Another Minimization Problem。

这道题看着就像 dp。

fi,j=fk−1,j−1+cost(k,i)f_{i,j}=f_{k-1,j-1}+cost(k,i)

这让我们想起了决策单调性。

cost(i,j)=∑xcntx(xntx−1)2cost(i,j)=\sum_x \frac{cnt_x(xnt_x-1)}{2}

我们需要证明这个有决策单调性,回忆一下 min⁡\min 的决策单调性:

(j,i)−(j,i−1)≤(j−1,i)−(j−1,i−1)(j,i)-(j,i-1)\le (j-1,i)-(j-1,i-1)

这个还是很容易证明的,所以这道题有了决策单调性。

然后就可以直接做了。

P4262 [Code+#3] 白金元首与莫斯科

P4262 [Code+#3] 白金元首与莫斯科。

插头 dp:

fi,j,sf_{i,j,s} 表示到了 (i,j)(i,j),现在轮廓线的状态为 ss。

分类讨论:

  • 如果现在是障碍点,只要没有向右或向下的插头就行了。

  • 不是障碍点也没有下/右插头,我们可以创建/不创建插头。

  • 有下/右插头,可以直接连成一块。

  • 都有就不合法。

枚举每一个点作为障碍点,O(n2m22m)O(n^2m^22^m),需要优化。

神奇的方法:倒着再做一遍,这样就可以相当于“跳过这个点”。

20260618

CF1473E Minimum Path

CF1473E Minimum Path。

我们发现减去的是最小值,加上的是最大值,所以我们可以想到对于没一条路径,我们需要让其权值更小。

这让我们想到了分层图最短路,是否已经决定了最大/小值。

AT_arc068_d [ARC068F] Solitaire

AT_arc068_d [ARC068F] Solitaire。

相当于制作一个单谷函数,然后再做一个以这个函数的下标为单谷的函数。

然后我们在草稿本上画画图吧。

我们考虑拆分。前 k−1k-1 个是由两个单调递减的序列混合而成的,第 kk 个是 11,后面的是任意的,2n−k−12^{n-k-1} 种。

我们现在需要考虑前 k−1k-1 个,需要满足的条件是,两个序列,一个最小值为 11,另一个的最小值需要大于剩下的序列的最大值。

我们设左边是最终会加入 11 的。

尝试 dp,设 fi,jf_{i,j} 表示拿出了 ii 个数,然后最后没有选到 11 的序列的最小值为 jj。

  • 加入左边:fi+1,j+=fi,jf_{i+1,j}+=f_{i,j}。

  • 加入右边:fi+1,j=∑j′>jfi,j′f_{i+1,j}=\sum_{j'>j}f_{i,j'}。

最后的答案:

2n−k−1×∑i=2n−k+2fk−1,i2^{n-k-1}\times \sum_{i=2}^{n-k+2}f_{k-1,i}

AT_agc002_f [AGC002F] Leftmost Ball

AT_agc002_f [AGC002F] Leftmost Ball。

fi,jf_{i,j} 表示有 ii 个白球,jj 种其他颜色的球。

fi,j=fi−1,j+fi,j−1×(n−j−1)×Cnk−i−(j−1)(k−1)−1k−2f_{i,j}=f_{i-1,j}+f_{i,j-1}\times(n-j-1)\times C^{k-2}_{nk-i-(j-1)(k-1)-1}

需要注意的一点是 -1,表示房钱颜色需要固定到第一个空位,保证不和其他颜色综合起来重复计算。

注意代码需要 inv[0]=1;。

P6383 『MdOI R2』Resurrection

P6383 『MdOI R2』Resurrection。

这道题是结论题,需要发现一个结论:对原树上任意两个有祖先后代关系的点 u,vu,v,它们在 GG 中的连边对应的原树路径,要么完全嵌套,要么完全相离,绝对不能交叉。

结论可以手搓搓出来,拿链来试。

我们发现如果当前边被断了,那么这个连通块的祖先就变成了这条边上的点,而不是原来的祖先了。

用这个思路去想,我们发现是无法做到交叉的。至于充分怎么证明:

初始决策集合:放入 G 中根的所有直接子节点。重复执行:

  • 选出决策集合里编号最小的节点 uu。
  • 将 uu 在原树中的父边加入删边序列 pp。
  • 从集合中移除 uu,将 uu 在 GG 中的所有直接子节点加入集合。

最终得到的排列 pp 即为合法删边顺序。我们发现是可行的。


从下往上 dp,答案延迟计算 dp。

fi,jf_{i,j} 表示到了 ii,祖先有 jj 个可以和它连边的时候的答案。

fi,j=∑x=1j∏fv,j−(x−1)+1f_{i,j}=\sum_{x=1}^j\prod f_{v,j-(x-1)+1}

xx 是枚举 ii 用了哪个祖先节点。

可以前缀和优化 dp。

P6071 『MdOI R1』Treequery

P6071 『MdOI R1』Treequery。

这种点很多的题目我们可以考虑 LCA。

我们尝试求出 LCA,然后可以发现。

  • 如果 pp 是父亲,答案就是 dis(p,LCA)dis(p,LCA)。

  • 如果没有关键点是 pp 包含祖先和后代,答案就是 00。

  • 如果没有关键点是 pp 的祖先/后代,答案就是 dis(p,LCA)dis(p,LCA)。

  • 否则就是 pp 与其他点最深的 LCA 的距离。

需要普通线段树维护 LCA,还需要可持久化线段树维护一个点子树里面的所有点和 l,rl,r 的交集。

其实这道题的可持久化线段树本质上是线段树合并,只是为了防止空间爆炸,用了可持久化线段树。然后左/右节点是否为空表示是否有值。

写法上注意,一棵树是 dfs 序上的,一棵不是。

P1393 Mivik 的标题

P1393 Mivik 的标题。

这道题容易想到 dp。设 fif_i 表示 ii 向前 i−∣S∣i-|S| 到 ii 是 ss 第一次出现的位置,那么答案就是:

∑i=∣s∣mfimn−i\sum_{i=|s|}^m f_i m^{n-i}

需要求出来 ff。我们考虑容斥,荣 mi−∣s∣m^{i-|s|} 减去不合法的方案,有以下两种:

  • 在 [1,i−∣s∣][1,i-|s|] 种已经出现了 ss。

  • ss 的前缀与之连成 ss。

第一种情况就可以用之前的 ff 消掉就行了,也就是减去 fjmi−∣s∣−jf_jm^{i-|s|-j}(重叠情况可能会被多减)。

第二种的转移我们需要利用 KMP 求出 Border 进行转移,也就是减去 ∑jfi−∣s∣−j\sum_j f_{i-|s|-j},但是是 O(n2)O(n^2) 的,需要用 Border Theory 优化。

所有 border 长度构成的序列,可以划分为 O(log⁡k)O(\log k) 个等差数列。

证明

引理一:对于任意字符串 ss,所有长度 大于等于 ∣s∣/2|s|/2 的 Border,其长度构成一个等差数列。


证明:

设字符串长度为 nn,最长 Border 长度为 pp(且 p≥n/2p \ge n/2)。那么把纸带向右平移 d=n−pd = n - p 格,纸带上的字符会完全重合(因为首尾对齐了)。dd 是最小步长。

然后再取另一个平移重合的步长 ee。向右走 dd 和 ee 格都能重合所以一定会有一个更短的步长。

有点抽象。距离:比如 44 和 66 我们会发现此时 1=7=31=7=3,于是凑出了 22,具体一点,我们可以把 ss 后面再拼接一个 ss。反正类似辗转相除。

s[x]=s[x+e]=s[x+e−d]s[x]=s[x+e]=s[x+e−d]

好吧,伪了,但我确实不会证明。

但是 dd 已经是更短的了,所以 dd 只能是 dd 的倍数,也就是 d,2d,3d⋯d,2d,3d\cdots。


首先,根据引理一,所有长度 >=∣s∣/2>= |s|/2 的 Border 构成第一个等差数列。

然后,剩下的 Border 长度都 <∣s∣/2< |s|/2。它们都是最长 Border 的 Border。

对剩下的 Border 递归应用同样的逻辑,每次处理的字符串长度至少减半。

因此,最多递归 log2(∣s∣)log2(|s|) 层,每层产生一个等差数列,总数就是 O(log∣s∣)O(log∣s∣)。

写代码一定需要注意 ll 和 rr 哪个大哪个小。。。

20260619

P5369 [PKUSC2018] 最大前缀和

P5369 [PKUSC2018] 最大前缀和。

一个前缀如果被选,那么他的后缀一定没有 <0<0 的,他后面的一定没有 >=0>=0 的。这个是充要条件。

我们考虑 dp。

设 fsf_s 表示选 ss 这个集合,并且满足所有前缀 <0<0 的方案数。

fs∣(1<<i)=fs+f(1<<i)f_{s|(1<<i)}=f_s+f_{(1<<i)}

设 gsg_s 表示选 ss 这个集合,并且满足所有后缀 >=0>=0 的方案数。

gs∣(1<<i)=gs+g(1<<i)g_{s|(1<<i)}=g_s+g_{(1<<i)}

枚举第一个元素 ii(可以为负数),最后的答案就是:

∑i=0n−1∑j⊆U(j&(1≪i))=0(g[j]⋅f[U^(j∣(1≪i))]⋅S[j∣(1≪i)])\sum_{i=0}^{n-1} \sum_{\substack{j \subseteq U \\ (j \mathbin{\&} (1 \ll i)) = 0}} \Big( g[j] \cdot f\big[ U \mathbin{\hat{}} (j \mathbin{|} (1 \ll i)) \big] \cdot S[j \mathbin{|} (1 \ll i)] \Big)

SS 表示这个集合所有元素的和。

AT_arc106_e [ARC106E] Medals

AT_arc106_e [ARC106E] Medals。

二分图匹配。二分答案,然后 Hall 定理进行快速判定。

我们需要判定 midmid 天内是否可以,我们对于每一个点集判断连向天的边数。

pip_i 是第 ii 天出勤员工的二进制 maskmask。fsf_s 表示当天来的人全部都在 ii 里面的日子天数。然后答案就是 mid−imid-i。

CF1083E The Fair Nut and Rectangles

CF1083E The Fair Nut and Rectangles。

n2n^2 左右的做法容易想到,枚举 xx 和 yy 的最大值属于谁,然后计算所有 ≤x,≤y\le x,\le y 的。

尝试按照 xx 从小到大排序。我们发现被包含的区间一定用不上,所以可以发现 yy 是从大到小的。

于是 fif_i 表示到了 ii。

fi=max⁡{fj+Si−ai−Si∩Sj}f_i=\max \{f_j+S_i-a_i-S_i\cap S_j\} fi=max⁡{fj+xiyi−ai−xjyi}f_i=\max \{f_j+x_iy_i-a_i-x_jy_i\} fj=yixj+fi−xiyi+aif_j=y_ix_j+f_i-x_iy_i+a_i

可以进行斜率优化。

注意:

C++
#define X(t) (a[t].x)
#define Y(t) (f[t])

不能写成 X(x) 不然会出神秘错误。

AT_agc030_f [AGC030F] Permutation and Minimum

AT_agc030_f [AGC030F] Permutation and Minimum。

看到 feecle 的题解了。套路:寻找充要条件。

我们发现这道题的充要条件形如:

  • 填的一个数大于 xx。

  • 填的一个数等于 xx。

于是可以想到,从大到小排序,进行处理。

可以 dp,设 fi,j,kf_{i,j,k} 表示到了 ii,还剩 jj 个 A 的空位,还剩 kk 个 B 的空位。最后的答案是 f0,0,0f_{0,0,0}。

目前有一些缺 11 的空位组和缺 22 的。

可列方程:

j = 2p + q \quad \text{总空位数} \\ k = p + q \quad \text{总未确定组数} \end{cases}

解得:p=j−kp = j - k,q=2k−jq = 2k - j。


转移过程中我们还需要知道还有多少个大于 ii 的数没有填。

  • 所在对的两个数都已知:fi−1,j,k=fi,j,kf_{i-1,j,k}=f_{i,j,k}。

  • 所在对还有一个未知数:

    • 让其成为 bb 值,f(i,j,k)→f(i−1,j−1,k−1)f(i,j,k)\to f(i-1,j-1,k-1)。
    • 不让其成为 bb 值,f(i,j,k)→f(i−1,j,k)f(i,j,k)\to f(i-1,j,k)。
  • 本身就是 −1-1:

    • 不是 bb,f(i,j,k)→f(i−1,j,k)f(i,j,k)\to f(i-1,j,k)。
    • 是 bb 且放入缺 22 的空位,pf(i,j,k)→f(i−1,j−2,k−1)pf(i,j,k)\to f(i-1,j-2,k-1)。
    • 放入还有 11 个数的空位,max⁡(q−S,0)f(i,j,k)→f(i−1,j−1,k−1)\max(q-S,0)f(i,j,k)\to f(i-1,j-1,k-1)。

这其中 SS 是比 ii 小的缺 11 的数对,我们不能让他们作为 ii 这里的 BB。


总结一下,我感觉这道题给的启示是 dp 从状态就可以得到很多信息,因此就可以更好地处理。

CF1988F Heartbeat

CF1988F Heartbeat。

对于排列计数,有两种方法,从位置考虑,从值域考虑。

我们考虑值域。

这种一看就觉得是 dp。设 fi,j,kf_{i,j,k} 表示插入了 ii 个数,有 jj 个前缀最大值,kk 个上升点的方案数。

貌似这个不好转移,所以我们考虑插入数,从 nn 到 11 插入,转移方程:

  • 插到最后面:fi,j,k←fi−1,j,kf_{i,j,k}\gets f_{i-1,j,k}。
  • 插到最前面:fi,j,k←fi−1,j−1,k−1f_{i,j,k}\gets f_{i-1,j-1,k-1}。
  • 插到上升点前面:fi,j,k←k×fi−1,j,kf_{i,j,k}\gets k\times f_{i-1,j,k}。
  • 插到下降点前面:fi,j,k←(i−k−1)×fi−1,j,k−1f_{i,j,k}\gets (i-k-1)\times f_{i-1,j,k-1}。

整理一下:

fi,j,k=fi−1,j−1,k−1+(k+1)×fi−1,j,k+(i−k−1)×fi−1,j,k−1f_{i,j,k}=f_{i-1,j-1,k-1}+(k+1)\times f_{i-1,j,k}+(i-k-1)\times f_{i-1,j,k-1}

然后这道题还有后缀,所以我们对后缀再 dp 一次得出 gg:

gi,j,k=gi−1,j−1,k+k×gi−1,j,k+(i−k)×gi−1,j,k−1g_{i,j,k}=g_{i-1,j-1,k}+k\times g_{i-1,j,k}+(i-k)\times g_{i-1,j,k-1}

计算答案的时候我们需要把排列按照 mm 把前缀最大值和后缀最大值拆分开,让他们不互相影响,最后的答案就是:

ansm=∑p=1m(m−1p−1)∑i=0p−1∑j=0m−p∑x=0p−1∑y=0m−pfp−1,i,x⋅gm−p,j,y⋅ai+1⋅bj+1⋅cx+y+[p>1]ans_m = \sum_{p=1}^m \binom{m-1}{p-1} \sum_{i=0}^{p-1}\sum_{j=0}^{m-p} \sum_{x=0}^{p-1}\sum_{y=0}^{m-p} f_{p-1,i,x} \cdot g_{m-p,j,y} \cdot a_{i+1} \cdot b_{j+1} \cdot c_{x+y+[p>1]}

O(n4)O(n^4) 需要优化。

我们发现左边只和 ii 有关,右边只和 jj 有关,所以我们可以定义 ss 和 tt:

slen,x=∑i=0lenflen,i,x⋅ai+1s_{len,x} = \sum_{i=0}^{len} f_{len,i,x} \cdot a_{i+1}

tlen,y=∑j=0lenglen,j,y⋅bj+1t_{len,y} = \sum_{j=0}^{len} g_{len,j,y} \cdot b_{j+1}

ansm=∑p=1m(m−1p−1)∑x=0p−1∑y=0m−psp−1,x⋅tm−p,y⋅cx+y+[p>1]ans_m = \sum_{p=1}^m \binom{m-1}{p-1} \sum_{x=0}^{p-1}\sum_{y=0}^{m-p} s_{p-1,x} \cdot t_{m-p,y} \cdot c_{x+y+[p>1]}

继续优化:

stj,k=∑y=0jtj,y⋅ck+yst_{j,k} = \sum_{y=0}^j t_{j,y} \cdot c_{k+y}

最后的答案:

ansi+j+1←(i+ji)⋅∑x=0isi,x⋅stj, x+[i>0]ans_{i+j+1} \gets \binom{i+j}{i} \cdot \sum_{x=0}^i s_{i,x} \cdot st_{j,\ x+[i>0]}

20260622

CF1905D Cyclic MEX

CF1905D Cyclic MEX。

我们需要一个 O(n)O(n) 的算法,于是想到一直向左循环移位然后算当前贡献。

此时,第一个数会被放到最后,那么所有 mexmex 大于它的都会变成它。由于 mexmex 单调不降,用单调队列维护。

CF1326E Bombs

CF1326E Bombs。

我们考虑答案是否可以为 xx,对于 xx 需要保证存在一个下标 ii 使得 ii 后面 ≥x\ge x 的数要比炸弹数多。

所以如果一个 xx 不合法,那么对于所有的 ii,≥x\ge x 的数的个数 ≤\le 炸弹数。

所以由于答案单调,所以我们维护 xx,如果不合法就减一。考虑用线段树维护,≥x\ge x 的数的个数与炸弹数的差的最大值,如果 ≥0\ge 0 就合法。

CF1777F Comfortably Numb

CF1777F Comfortably Numb。

别把 max⁡\max 看成 mexmex 了。

子区间最大值问题可以考虑分治。

我们需要求出来每一个最大值的管辖区间,然后这个区间中目标是求: max⁡j∈[li,i]k∈[i,ri](ai⊕sj−1⊕sk)\max_{\substack{j\in[l_i,i] \\ k\in[i,r_i]}} \big(a_i \oplus s_{j-1} \oplus s_k\big)

要支持查询区间 [L,R][L,R] 内的数与 xx 的最大异或,需要用可持久化 Trie,也就是这个 Trie 包含一个前缀的所有数。其实每次暴力塞也行,就定根就行了。

CF1444C Team-Building

CF1444C Team-Building。

判断二分图的充要条件是没有奇环,可以用扩展域并查集判断。

先排除本身就不是二分图的,然后假设还剩 cntcnt 个,用为 (cnt2)\binom{cnt}{2} 减去不合法的。因为不合法的情况数是 O(m)O(m) 的,最多只有 mm 调跨块的边。

if(ct[c[u]])continue;,if(x==y)continue; 这种特判不要漏掉。

CF997E Good Subsegments

CF997E Good Subsegments。

题目要求的是:(max⁡−min⁡)−(r−l)=0(\max-\min)-(r-l)=0。

询问区间子序列的信息,可以离线移动右指针。我们尝试在当前指针 rr 维护 (max−min)−(r−l)(max−min)−(r−l) 的最小值和最小值个数。

然后线段树还需要维护每一个 ll 开头的到当前的 ii 中的好的子区间个数。

20260623

CF372C Watching Fireworks is Fun

CF372C Watching Fireworks is Fun。

fi,jf_{i,j} 表示第 ii 次发射时人在第 jj 个区间。

fi,j=min⁡(fi−1,k)+bi−∣ai−j∣,k∈[max⁡(1,j−t×d),min⁡(n,j+t×d)]f_{i,j}=\min(f_{i-1,k})+b_i - \vert a_i - j\vert,k\in[\max(1,j-t\times d),\min(n,j+t\times d)]

这个需要优化。先把 bib_i 给提出来。

可以观察到每一个 f(j)f(j) 的折线多都是单谷函数,所以想到了 slope trick。

还有一种方法就是正着和倒着都进行一遍单调队列优化 dp,就是合法区间,然后区间中维护最小值。

CF1093G Multidimensional Queries

CF1093G Multidimensional Queries。

带有绝对值的题目第一眼看着一定是拆绝对值。用 max⁡\max 可以拆,我们用二进制拆分,表示每一个点拆分过后每一位的符号变化,然后只需要对于对应的数进行 max⁡f0+f31,f1+f30\max f_0+f_{31},f_1+f_{30} 这种形式的了。

CF1422F Boring Queries

CF1422F Boring Queries。

把 LCM 转换成 GCD,LCA 是乘积之和再除以两两数之间的最大公约数。

然后我们发现可以用线段树,对于每一个 rr 维护前面的信息。

这里我们要用到主席树,对于每一个 rr 维护前面的所有质因子的次幂,只有最后一次出现需要记录贡献,其余都要乘上逆元抵消掉原有的。

CF940F Machine Learning

CF940F Machine Learning。

带修莫队。

CF321E Ciel and Gondolas

CF321E Ciel and Gondolas。

dpi,j=min(dpi−1,k−1+calc(k,j))dp_{i,j}=min( dp_{i-1,k-1} + calc(k,j))

决策单调性。

20260625

CF240F TorCoder

CF240F TorCoder。

对于每一个字母开一颗线段树,然后按照顺序处理。

所以对于同一个字母位置关系不重要的可以每一个字母开一个线段树维护。

CF813E Army Creation

CF813E Army Creation。

关键点:寻找不变量 kk,然后问题转化。

相当于求:

∑imin⁡(cnti,k)\sum_{i}\min(cnt_i,k)

我们发现答案就是区间长度减去大于 kk 的那一部分,所以每一个数需要处理出前面第 kk 个相同的数。答案就相当于询问有多少个 prei≤lpre_i \le l。

这个就是主席树了,跟区间和权值有关的问题可以直接转化成主席树与差分。

分块也可以做,需要一个数组 numi,jnum_{i,j} 表示块 ii 到 jj 的答案。

CF1080F Katya and Segments Sets

CF1080F Katya and Segments Sets。

有两个维度,考虑主席树。

我们考虑维护每一个集合对于所有 l≥xl\ge x 的线段中,rr 的最小值。

线段维度就相当于版本,也就是问题转化成了静态查询,查询这个集合区间内是否符合。因为集合不能作为版本,不可差分。

所以我们按照 ll 从大到小排序,二分找到第一个 l≥xl\ge x 的版本,然后找到这个版本中 [a,b][a,b] 的最大值。

CF1446D2 Frequency Problem (Hard Version)

CF1446D2 Frequency Problem (Hard Version)。

性质:这个子串的众数(设为 XX)一定包含整个序列的众数。反证法,如果不包含,可以通过一直扩展的方式,得到更好的答案。

和数字值,个数的东西有关的可以想想根号分治。

这种不好处理的东西尝试一下根号分治。我们分治出现次数大于 n\sqrt n 和小于 n\sqrt n 的。

大于的,种类数 ≤n\le \sqrt n,可以枚举种类数。我们使用计数器 cntcnt,遇到 XX 就 +1+1,遇到 YY 就 −1-1。我们需要找到最长的一段使得开头结尾 cntcnt 都相同。

小于的,枚举最大出现的次数,双指针保证出现次数 ≤k\le k。

CF258D Little Elephant and Broken Sorting

CF258D Little Elephant and Broken Sorting。

fi,jf_{i,j} 表示 ii 位置上大于 jj 的概率(ai>aja_i>a_j)。

交换 aa 和 bb 就是:

fx,i=fy,i=fx,i+fy,i2fi,x=fi,y=fi,x+fi,y2f_{x,i}=f_{y,i}=\frac{f_{x,i}+f_{y,i}}{2}\\ f_{i,x}=f_{i,y}=\frac{f_{i,x}+f_{i,y}}{2}

20260626

CF1000F One Occurrence

CF1000F One Occurrence。

莫队做法太显然了,想想别的做法。

线段树做法可以想到,我们需要让一个数值在区间最右边的数的前驱小于 ll。

CF965E Short Code

CF965E Short Code。

直接贪心(暴力)是错的,所以最深的点需要优先选。

用优先队列维护。

比如有左边两条链,一边长,如果祖先被短的用掉了就不好了。

CF375D Tree and Queries

CF375D Tree and Queries。

子树问题考虑树上启发式合并。

每次合并到一个点可以直接获取到他每个颜色的个数的数组,也不难。

保证不少于的方法就是数加进去只会让新的个数的计数 +1+1,原来的不减去。

注意 dfs 序的 idid。

CF1580B Mathematics Curriculum

CF1580B Mathematics Curriculum。

***题,n=100n=100 标算 O(n3)O(n^3)。

计数题目先想 dp,排列的问题可以拆分序列。

感觉第一步是发现性质,好数需要怎么判断。我们发现就是就是左右两边的前缀最大值个数相加再 +1+1,所以我们可能需要拆分。然后我们发现最大值刚好可以拆分左右两边互不影响。

这种题显然 dp,尝试设 fi,j,kf_{i,j,k} 表示长度为 ii,有 jj 个最大值恰好有 kk 种取值的 k−好数k-好数。

考虑转移,我们可以拆分序列,枚举最大值的位置:

fi,j,k=∑p(i−1p−1)∑tfp−1,t,k−1×fi−p,j−t−[k=1],k−1f_{i,j,k}=\sum_p\binom{i-1}{p-1}\sum_t f_{p-1,t,k-1} \times f_{i-p,j-t-[k=1],k-1}

要加上 if(L&&R)add(now,L*R%P*C[i-1][p-1]%P); 不加 if(L&&R) 就 TLE 慢几十倍?

CF2111G Divisible Subarrays

CF2111G Divisible Subarrays。

最值问题可以枚举最值,然后计算区间。问题转化可以通过类似“一个数左边/右边第一个大于/小于这个数的数”这种形式的来表达。

感觉真的不好想。我们设最大值为 ii:

  • xx 为左边第一个大于 aia_i 的位置。
  • yy 为右边第一个大于 aia_i 的位置。
  • zz 为 yy 右边第一个小于 aia_i 的位置。

分类讨论,第一种的话,合法的区间需要保证:x<l≤i,y≤r<zx<l\le i,y\le r<z。

然后这个可以转化成举行覆盖问题:

l∈[x+1,i],  r∈[y,z−1]l\in[x+1,i],~~r\in [y,z-1]

所以我们问题转化成了矩形加,单点查询。

尝试扫描线,按照 ll 排序,然后扫到 l=x+1l=x+1 的时候在 [y,z−1][y,z-1] 加 11,然后扫到 i+1i+1 的时候恢复。

但是这是一道在线的题目,所以我们就需要提前用主席树把所有的状态保存下来,可持久化一下,就可以了。

单点查询所以 tag 可以直接保留不用下传,询问下去的时候统计所有父亲 tag 的和。

CF1656F Parametric MST

CF1656F Parametric MST。

注意,可能有负数。

先考虑对于每一个 tt 求出值。

ai∗aj+t∗(ai+aj)=(ai+t)(aj+t)−t2a_i*a_j+t*(a_i+a_j)\\ =(a_i+t)(a_j+t)-t^2

让每一个点和与其连边最大的边相连。我们只需要对于 au+t≥0a_u+t\ge 0 的,连接最小的 av+ta_v+t,否则连接最大的。

然后判断 +∞+\infty 的时候的值就可以判掉无穷的情况了。

最后的答案一定是一个 aia_i,因为可以证明树的形态不变,然后这个 f(t)f(t) 是在每两个取值之间都是一次函数。

20260629

CF1477A Nezzar and Board

CF1477A Nezzar and Board。

首先我们先看看 2x−y2x-y 是什么东西,我们化一下即可发现 x+(x−y)x+(x-y),也就是这个数可以一直延伸成一个等差数列。

然后考虑怎么处理。我们先排序,然后差值就全部可以表示出来了,设集合为 aa。我们最后只需要解出这样的方程:x+∑i=2nviai=kx+\sum_{i=2}^n v_ia_i=k。然后用裴蜀定理,有解的充要条件是 gcd⁡ai∣(k−x)\gcd a_i|(k-x)。

CF547C Mike and Foam

CF547C Mike and Foam。

这道题我们需要求出对于每一个数和它互质的数。用总数减去不互质的数即可,不互质的数可以用容斥来做,一个数的不同质因子数是有限的。

CF839D Winter is here

CF839D Winter is here。

这就是一个套路了,枚举 gcd⁡\gcd,然后 gig_i 是为 ii 的倍数的贡献,fif_i 是为 ii 的贡献。

首先肯定是枚举 gcd⁡\gcd。

设 gig_i 表示 gcd⁡\gcd 是 ii 的倍数的数的长度和。设 sis_i 表示 ii 的倍数出现次数,gi=si∗2si−1g_i=s_i*2^{s_i-1}(每一个数倍 2n−12^{n-1} 个集合选中)。

然后答案容斥一下即可。

CF338D GCD Table

CF338D GCD Table。

首先行是不变的,所以 x∣lcm(aj,⋯ ,aj+l−1)x|lcm(a_j,\cdots,a_{j+l-1})。

然后需要保证的:

{y=0(moda1)y=−1(moda2)⋮y=−k+1(modak)\begin{cases} y=0\pmod{a_1} \\ y=-1\pmod{a_2} \\ \vdots \\ y=-k+1\pmod{a_k} \end{cases}

然后还需要验证,因为没有充分性,这样只能求出 ai∣gcd⁡(x,y+i−1)a_i|\gcd(x,y+i-1),需要保证等于。

CF1146E Hot is Cold

CF1146E Hot is Cold。

和位置关系不大的题目考虑值域。

我们考虑值域线段树,维护每一个值。然后同一个值最后翻转的情况一定相同,所以直接打区间 tag 就行了。

然后比如 > x 这个询问,我们分类讨论正负数的情况。我们发现一些部分可以强制变成正数/负数(因为对应的相反区间不变),所以需要区间翻转和区间赋值操作。

需要注意翻转的 tag 和 赋值的 tag,赋值之后翻转的 tag 清零,但是 pushdown 之后两个都需要操作的。

CF891E Lust

CF891E Lust。

容易发现,答案的增加量就是 aia_i 乘积的减少量。所以答案就是最初的乘积减去最后的乘积。

我们设每一个数选中的次数为 bib_i,则 ∑ibi=k\sum_i b_i = k。

然后排列的数量有 k!∏i=1nbi!\dfrac{k!}{\prod_{i=1}^nb_i!}。

最后的期望:

1nk∑bi≥0∑bi=k(k!∏bi!)∏i(ai−bi)\frac{1}{n^k} \sum_{\substack{b_i\ge0\\\sum b_i=k}} \left( \frac{k!}{\prod b_i!} \right) \prod_i (a_i - b_i)

所以对于一组 bb:

=k!nk∏i=1nai−bibi!=\frac{k!}{n^k} \prod_{i=1}^n \frac{a_i - b_i}{b_i!}

尝试把后面的东西用指数生成函数计算。

fi(x)=∑j=0∞ai−jj!xj=∑j=0∞aij!xj−x⋅xj−1(j−1)!=(ai−x)exf_i(x)=\sum_{j=0}^{\infty}\frac{a_i-j}{j!}x^j=\sum_{j=0}^{\infty}\frac{a_i}{j!}x^j-\frac{x\cdot x^{j-1}}{(j-1)!}=(a_i-x)e^x F(x)=∏i=1nfi=enx∏i=1n(ai−x)F(x)=\prod_{i=1}^n f_i=e^{nx}\prod_{i=1}^n(a_i-x)

需要求出第 kk 项。

[xk]((∑i=0∞nixii!)∏i=1n(ai−x))[x^k]((\sum\limits_{i=0}^\infin\frac{n^ix^i}{i!})\prod\limits_{i=1}^n(a_i-x))

右边的显然可以预处理出来,设为 ∑cixi\sum c_ix_i。

然后就变成了:

∑i=0ncink−i(k−i)!\sum_{i=0}^nc_i\frac{n^{k-i}}{(k-i)!}

CF449D Jzzhu and Numbers

CF449D Jzzhu and Numbers。

还是很套路的,设 gsg_s 表示与起来包含 ss 的情况数,然后就可以求出 ff 来。

CF559C Gerald and Giant Chess

CF559C Gerald and Giant Chess。

我们发现黑格子很少,能不能计算总路径减去包含黑格子的然后容斥什么的。

总路径数是 Ch+w−2w−1C_{h+w-2}^{w-1}。

我们还需要计算黑色点的贡献,主要问题就是一条路径会有多个黑点。先设 fif_i 表示第 ii 个点是路径第一个黑点的时候的贡献。

fi=Cx+y−2x−1−fjCx−xj+y−yjx−xjf_i=C_{x+y-2}^{x-1}-f_jC_{x-x_j+y-y_j}^{x-x_j}

CF1557D Ezzat and Grid

CF1557D Ezzat and Grid。

首先容易想到 dp:

fi=∑j<i and (i,j)fj+1f_i = \sum_{j<i~and~(i,j)} f_j +1

可以用线段树,维护每一个位置上 ff 值最大的值就行了。需要离散化。

CF1091H New Year and the Tricolore Recreation

CF1091H New Year and the Tricolore Recreation。

这道题我们发现两个人移动棋子是等价的,都是从两个间隔中选一端进行移动,所以可以想到 SG 函数。

sg0=0sg_0=0,sgi=mex{sgi−k}sg_i=mex\{sg_{i-k}\}。

最后把所有 sg 异或起来即可。

只是 sg 函数不好求,会 TLE,所以我们尝试优化,可以使用 bitset 进行优化。

fvf_v 是一个 bitset,它的第 xx 位为 11,当且仅当 状态 xx 能一步到达某个 SG 值为 vv 的状态。

我们的优化方法就是对于一个 sg 值维护拥有 TA 的下标。

CF1065E Side Transmutations

CF1065E Side Transmutations。

先转化一下题目的意思,就是 bb 限制了连续一段的翻转情况需要相同。

对于中间的那些随便选了,能够对应上的一些段的答案就是(拆分左右两边相同/不同的答案):

Alen(Alen−1)2+Alen=Alen(Alen+1)2\frac{A^{len}(A^{len}-1)}{2}+A^{len}\\ =\frac{A^{len}(A^{len}+1)}{2}

最后的答案就是:

An−2∗bm∏Alen(Alen+1)2A^{n-2*b_m}\prod \frac{A^{len}(A^{len}+1)}{2}

CF1106F Lunar New Year and a Recursive Sequence

CF1106F Lunar New Year and a Recursive Sequence。

神秘的降幂方式:用原根!

我们发现 998244353998244353 的原根是 33,原来的递推式就变成了:

3gi≡∏j=1k(3gi−j)bj≡3∑j=1kgi−j⋅bj(modp)3^{g_i} \equiv \prod_{j=1}^{k} (3^{g_{i-j}})^{b_j} \equiv 3^{\sum_{j=1}^{k}g_{i-j} \cdot b_j} \pmod p gi=(∑j=1kgi−j⋅bj) mod (p−1)g_i = \left( \sum_{j=1}^{k} g_{i-j} \cdot b_j \right) \bmod (p-1)

这个我们发现可以用矩阵快速幂解决:

[gigi−1⋯gi−k+1]×[b110⋯0b201⋯0b300⋱⋮⋮⋮⋮⋱1bk00⋯0]=[gi+1gi⋯gi−k+2] \begin{bmatrix} g_i & g_{i-1} & \cdots & g_{i-k+1} \end{bmatrix} \times \begin{bmatrix} b_1 & 1 & 0 & \cdots & 0 \\ b_2 & 0 & 1 & \cdots & 0 \\ b_3 & 0 & 0 & \ddots & \vdots \\ \vdots & \vdots & \vdots & \ddots & 1 \\ b_k & 0 & 0 & \cdots & 0 \end{bmatrix} = \begin{bmatrix} g_{i+1} & g_i & \cdots & g_{i-k+2} \end{bmatrix}

然后我们得到关系 gn=u∗gvg_n=u*g_v(gg 前 k−1k-1 项都是 00),于是:fku=m(modp)f_k^u=m \pmod p 可以用 BSGS 解决。

CF960G Bandit Blues

CF960G Bandit Blues。

相当于给定前缀最大值的个数和后缀最大值的个数,问序列种数。

需要第一类斯特林数,不会算。

20260702

CF1182E Product Oriented Recurrence

CF1182E Product Oriented Recurrence。

这道题算出这几项是几次幂就行了,拆分开算。

CF1514D Cut and Stick

CF1514D Cut and Stick。

相当于就是找到区间出现次数最多的数。单独的众数单独成一段。

然后莫队可以直接做,就是维护区间众数个数。del 的时候直接判断当前数字有没有别的数,没有就把答案减一。

注意初始的时候有 nn 个 00 需要赋值。

CF1548C The Three Little Pigs

CF1548C The Three Little Pigs。

∑i=1n(3ix)\sum_{i=1}^n\dbinom{3i}{x}

3i<x3i<x 时 (3ix)=0\binom{3i}{x}=0。

可以想想杨辉三角的结论,(3ix)\binom{3i}{x} 是 (1+x)3i(1+x)^{3i} 的 xx 次项系数,所以:

Ans(x)=[xx]∑i=1n(1+x)3iAns(x) = [x^x] \sum_{i=1}^{n} (1+x)^{3i}

等比数列求和:

∑i=1n(1+x)3i=(1+x)3−(1+x)3n+31−(1+x)3\sum_{i=1}^{n} (1+x)^{3i} = \frac{(1+x)^3 - (1+x)^{3n+3}}{1 - (1+x)^3} ∑i=1n(1+x)3i=(1+x)3n+3−(1+x)33x+3x2+x3\sum_{i=1}^{n} (1+x)^{3i} = \frac{(1+x)^{3n+3}-(1+x)^3 }{3x + 3x^2 + x^3}

直接进行大除法,就行了。


还有一种方法:

设 fx,j=∑i=0n(3i+jx)f_{x,j}=\sum_{i=0}^n \binom{3i+j}{x},答案就是 fx,0f_{x,0}

fx,0+fx,1+fx,2=∑i=03n+2(ix)=(3n+3x+1)f_{x,0}+f_{x,1}+f_{x,2}=\sum_{i=0}^{3n+2} \binom{i}{x}=\binom{3n+3}{x+1}

(nm)=(nm−1)+(n−1m−1)\binom{n}{m}=\binom{n}{m-1}+\binom{n-1}{m-1},fx,1=fx−1,1+fx−1,0,fx,2=fx−1,2+fx−1,1f_{x,1}=f_{x-1,1}+f_{x-1,0},f_{x,2}=f_{x-1,2}+f_{x-1,1}

然后就可以求出来了。

CF1780F Three Chairs

CF1780F Three Chairs。

直接莫反,注意里面的式子是 ii 还是 aia_i。

CF603C Lieges of Legendre

CF603C Lieges of Legendre。

公平组合游戏一般先尝试一下 sg 函数。

我们发现有多个堆,只需要把每一个的异或起来就行了。

偶数的情况:

sgi=mex{sgx/2(k个异或起来),sgx−1}sg_i = mex\{sg_{x/2}(k 个异或起来),sg_{x-1} \}

然后我们发现 kk 个异或跟奇偶性有关。

奇数的情况:

sgi=mex{sgx−1}sg_i = mex\{sg_{x-1} \}

先列出 sg 值,比如 kk 为奇数:

C++
0 1 0 1 2 0 2 0 1 0 1

偶数:

C++
0 1 2 0 1 0 1 0 1 0 1

整理一下:

xx 为奇数:sgx=mex{sgx−1}=0sg_x=mex\{sg_{x-1}\}=0。x≥3x\ge 3。

xx 为偶数,若 kk 为偶数:sgx=mex{sgx−1,0}=1sg_x=mex\{sg_{x-1},0\}=1。

xx为偶数,kk 为奇数,sgx=mex{SG(x−1),SG(x2)}=mex{0,SG(x2)}sg_x=mex\{SG(x-1),SG\left(\frac{x}{2}\right)\}=mex\{0,SG\left(\frac{x}{2}\right)\},递归处理。

P4199 万径人踪灭

P4199 万径人踪灭。

容易想到容斥,满足 11 不满足 22 的就是马拉车了,可以求出以一个点为中点的连续的回文子串的个数。

所以我们还需要算出来满足 11 的总方案数。我们发现这个只需要算出来对于每一个位置 ii 位置和值都对称的数的个数 cic_i 即可,最后答案是 2ci−12^{c_i}-1。

突破口:只有两种字符。对于每一个字符,将自己和自己做卷积(FFT),cntkcnt_k 表示有多少个 i+j=ki+j=k 的相同的对子,除以二就行了。

也就是自己和自己卷积可以获取下标的和为一个值的时候的数量,真的很强。

CF755G PolandBall and Many Other Balls

CF755G PolandBall and Many Other Balls。

设选了 ii 个双球组,有 k−ik-i 个单球组。

  • 先把 ii 个双球组放进 nn 个位置中,方案数:(n−ii)\binom{n-i}{i}。

  • 然后从这 ii 个双球组和 k−ik-i 个单球组中,选出最终的 kk 个组:(ki)\binom{k}{i}。

所以:

f(k)=∑i=0k(n−ii)(ki)f(k) = \sum_{i=0}^k \binom{n-i}{i} \binom{k}{i}

这个公式对吗?不对,因为双球组的位置限制会导致重叠,所以需要容斥。

f(k)=∑i=0k(−1)i(ki)(n−ik−i)2k−if(k) = \sum_{i=0}^k (-1)^i \binom{k}{i} \binom{n-i}{k-i} 2^{k-i}
  • (ki)\binom{k}{i}:从 kk 个组中钦定 ii 个位置发生“重叠”
  • (n−ik−i)\binom{n-i}{k-i}:从剩下 n−in-i 个位置中选 k−ik-i 个组
  • 2k−i2^{k-i}:每个组可以是单球或双球

展开组合数:

f(k)=k!(n−k)!∑i=0k(−1)i(n−i)!i!⋅2k−i((k−i)!)2f(k) = \frac{k!}{(n-k)!} \sum_{i=0}^k \frac{(-1)^i (n-i)!}{i!} \cdot \frac{2^{k-i}}{((k-i)!)^2}

引入下降幂:

(n−i)!=n!ni‾(n-i)! = \frac{n!}{n^{\underline{i}}}

代入:

f(k)=k!⋅nk‾∑i=0k(−1)ii!⋅ni‾⋅2k−i((k−i)!)2f(k) = k! \cdot n^{\underline{k}} \sum_{i=0}^k \frac{(-1)^i}{i! \cdot n^{\underline{i}}} \cdot \frac{2^{k-i}}{((k-i)!)^2}

尝试卷积,令:

Ai=(−1)ii!⋅ni‾A_i = \frac{(-1)^i}{i! \cdot n^{\underline{i}}} Bj=2j(j!)2B_j = \frac{2^j}{(j!)^2}

则:

f(k)=k!⋅nk‾⋅(A∗B)kf(k) = k! \cdot n^{\underline{k}} \cdot (A * B)_k

可以用卷积。

20260703

CF1610D Not Quite Lee

CF1610D Not Quite Lee。

首先,我们肯定希望找出好的定义。但是我们发现这个东西没有办法直接找,比如:好像不是,比如 121 2:−1−2-1 -2 和 33 也可以凑出来。

所以我们先尝试用代数形式表达:

∑bi(si∗2+bi−1)2=0\sum \frac{b_i(s_i*2+b_i-1)}{2}=0 ∑bi(bi−1)=2∑bisi\sum b_i(b_i-1)=2\sum b_is_i

令 A=bi(bi−1)2A=\frac{b_i(b_i-1)}{2}:

∑bisi=A\sum b_is_i = A

然后用裴蜀定理:

gcd⁡{b1,⋯ ,bm}∣A\gcd\{b_1,\cdots,b_m\}|A gcd⁡{b1,⋯ ,bm}∣bi(bi−1)2\gcd\{b_1,\cdots,b_m\}|\frac{b_i(b_i-1)}{2}

然后神秘转化:

2∣∑bi(bi−1)gcd⁡2|\frac{\sum b_i(b_i-1)}{\gcd}

我们令 gcd⁡=2xy\gcd = 2^xy:

2∣∑bi2x(bi−1)2|\sum \frac{b_i}{2^x}(b_i-1)

我们发现 bi2x\frac{b_i}{2^x} 一定除得尽,令其为 cic_i:

2∣∑ci(2xci−1)2|\sum c_i(2^xc_i-1)

分类讨论,xx 为 00 一定可以,否则就看 cic_i 的奇偶性,奇数出现次数需要是偶数。相当于 22 的次幂出现最少的数的个数为偶数。也就是 2∣∑ci2|\sum c_i。

所以是有奇数是好序列,否则 22 的次幂出现最少的数的个数为偶数也是好序列。

有奇数的序列的个数是总数减去全偶数的。

另一种情况的统计,我们把每一个数的 22 的次幂从小到大排序,然后枚举,让最小的次幂出现次数为偶数,然后其余任意。

CF280C Game on Tree

CF280C Game on Tree。

设 fif_i 表示 ii 这个子树被删除的期望次数,可以通过子树转移。

但是很不幸,这个是错的,因为我们需要的是尚未被删去的节点计入概率计算。

我们考虑一个点被选中的期望,我们可以发现是 1dep\frac{1}{dep},于是...就做完了。

CF439E Devu and Birthday Celebration

CF439E Devu and Birthday Celebration。

首先肯定要枚举 nn 的因数,因为 gcd⁡\gcd 一定是一个因数。

然后还需要再进行一次容斥,就是小的因数需要减去它的倍数的贡献。

n+log⁡2n\sqrt n+ \log^2 n。算了,去看看题解吧。(让 DS 写了一遍,5000ms5000ms 整竟然过了)。

可以莫反,因为含有 gcd⁡\gcd,即使是多个数的 gcd⁡\gcd。

∑a1=1n∑a2=1n...∑af=1n[∑i=1fai=n,gcd⁡(ai)=1]\sum_{a_1=1}^{n}\sum_{a_2=1}^{n}...\sum_{a_f=1}^{n}[\sum_{i=1}^{f}a_i=n,\gcd(a_i)=1] ∑d=1nμ(d)∑d∣a1n∑d∣a2n...∑d∣afn[∑i=1fai=n]\sum_{d=1}^{n}\mu(d)\sum_{d\mid a_1}^{n}\sum_{d\mid a_2}^{n}...\sum_{d\mid a_f}^{n}[\sum_{i=1}^{f}a_i=n] ∑d=1nμ(d)∑a1=1n/d∑a2=1n/d...∑af=1n/d[∑i=1fai=nd]\sum_{d=1}^{n}\mu(d)\sum_{a_1=1}^{n/d}\sum_{a_2=1}^{n/d}...\sum_{a_f=1}^{n/d}[\sum_{i=1}^{f}a_i=\frac{n}{d}]

然后隔板法 (n−1m−1)\binom{n-1}{m-1}。

注意计算 n/in/i 的贡献的时候 μ\mu 里面是 n/in/i。还要注意 μ\mu 可以是负数,所以 ansans 需要 +mod+mod 再  mod  mod\bmod ~ mod。

CF113D Museum

CF113D Museum。

这种无穷的概率题,一般是高斯消元,不过你循环个多少次减少误差也能过吧。

先定义状态,fi,jf_{i,j} 表示两人分别在 i,ji,j 的概率。

初始的时候是 11。

fi,j=∑1−pudegu1−pvdegvfu,v+∑1−pudegupjfu,j+∑pi1−pvdegvfi,v+pipjfi,jf_{i,j}= \sum\frac{1-p_u}{deg_u}\frac{1-p_v}{deg_v}f_{u,v}+ \sum\frac{1-p_u}{deg_u}p_jf_{u,j}+ \sum p_i\frac{1-p_v}{deg_v} f_{i,v}+ p_ip_jf_{i,j}

注意,只有停止的状态的和需要是 11,也就是这道题的相等,其余任意。而且别的位置的叫“期望次数”。

CF1580D Subsequence

CF1580D Subsequence。

fl,r,kf_{l,r,k} 表示在 [l,r][l,r] 之间,选 kk 个数的最大值。

考虑转移,我们发现转移肯定要拆分序列并且两边不互相影响,所以我们尝试从最小值 pp 转移:

fl,p−1,x+fp+1,r,k−x−2x(k−x)ap→fl,r,kf_{l,p-1,x}+f_{p+1,r,k-x}-2 x (k-x) a_{p}\to f_{l,r,k}

fl,p−1,x+fp+1,r,k−x+map−(2(x+1)(k−x+1)−1)ap→fl,r,k+1f_{l,p-1,x}+f_{p+1,r,k-x}+m a_{p}-(2 (x+1) (k-x+1)-1) a_{p}\to f_{l,r,k+1}

题解还有笛卡尔树的,本质相同。

注意 l=rl=r 的时候原式只有 11 次。

CF1842G Tenzing and Random Operations

CF1842G Tenzing and Random Operations。

题目意思就是:E(∏i=1n(ai+∑j=1m[bj≤i]×v))E(\prod\limits_{i = 1}^n (a_i + \sum\limits_{j = 1}^m [b_j \le i] \times v))。

题解里面有用组合意义的:一个人行 11 出发,从 ii 到 i+1i+1 有 aia_i 种方案,修改就是相当于在 pp 放了要一个工具,可以在每一个点选择一个工具以 vv 的方案数走到 i+1i+1。

fi,jf_{i,j} 表示前 ii 个用了 jj 个工具。

使用 ai+1a_{i+1},fi+1,j←fi,jai+1f_{i + 1, j} \gets f_{i, j}a_{i+1}。

使用用过的工具,fi+1,j←fi,jjvf_{i+1, j} \gets f_{i, j} j v;

使用一个还未被使用过的工具,fi+1,j+1←fi,j(i+1)(m−j)vf_{i+1, j+1} \gets f_{i, j} (i+1)(m-j) v。

然后这个东西也可以不用组合意义来写,但是这样理解真的很形象的,神了。

相当于有工具,你可以选择之前的工具现在第一次用。

然后我的问题是一个点新开了多个工具怎么办,我们发现可以直接用 (m−j)(m-j) 解决掉,因为这个就包含了那么多种情况。

还有拆贡献的理解,就是拆开 ∑(ai+v+⋯ )\sum(a_i+v+\cdots)。

(a1+v⋅c1)×(a2+v⋅c2)×⋯×(an+v⋅cn)(a_1 + v\cdot c_1) \times (a_2 + v\cdot c_2) \times \cdots \times (a_n + v\cdot c_n)