本文搬运自本人初中博客园博客,若图片加载不出来,可到原文查看:https://www.cnblogs.com/zhangtingxi/p/16736191.html

打*表示看题解后才懂

打^表示想错了

可能有些题和题解不一样,也许是口胡错了(?)

有些题你发现这里没有可能是以前做了,这里就不补了

CF1734E*

首先整行整列加没影响,于是可以构造任意合法矩阵后满足对角线性质

对于每个 ai,ja_{i,j} 考虑用 i,ji,j 表达式表达出来,根据上面的性质,如果只对 i,ji,j 单独操作是没影响的,于是必须对同时含有 i,ji,j 的项进行操作,考虑 i×ji\times j,由于 nn 为质数,所以符合条件

CF1729G

首先暴力kmp一下(我在说什么?)

然后设 fi,0/1f_{i,0/1} 表示以 ii 结尾且 ii 这个位置(以其末尾)取或不去的最小段数

假如 ii 这个位置不能完全匹配 fi,0/1=min(fi1,0,fi1,1)f_{i, 0/1}=\min(f_{i-1,0},f_{i-1,1})

可以匹配就是 fi,1=minfit,0,fit,1f_{i,1}=min{f_{i-|t|,0},f_{i-|t|,1}}fi,0=minj=1t1fij,1f_{i,0}=min_{j=1}^{|t|-1}f_{i-j,1}

方案那个数组顺便统计就行

CF1725F

显然,对于每个 wjw_j,我们可以令它每一步长度都为其二进制下1的最低位(因为更大的步数必然可以由小步数组成),现在我们相当于只有30种步了(log2wj\log_2w_j

考虑对于每种步处理。设当前二进制最低位1为 2k2^k,若 RiLi2kR_i-L_i\geq 2^k,则无论在哪一列都能走到。

然后考虑 RiLi<2kR_i-L_i<2^k,可以发现一个性质,就是无论怎么走,Li,RiL_i,R_i2k2^k 取模不变。因此我们可以让他们全部走到最前面。

为了方便处理,我们把范围当做是 [0,2k+1][0,2^{k+1}],设当前区间为 [x,y](xy<2k)[x,y](x-y<2^k)

  • xmod2k>ymod2kx\bmod 2^k>y\bmod 2^k,此区间为 [x,y],[x+n,y+n][x,y],[x+n,y+n]

排序后就是个区间覆盖问题

  • xmod2kymod2kx\bmod 2^k\leq y\bmod 2^k,此区间为 [x,y+2k][x,y+2^k]

CF1684E

考虑贪心

假如每次操作,我们考虑使对 DIFF\text{DIFF} 变小或让 MEX\text{MEX} 变大

DIFF\text{DIFF} 每次最多减小1, MEX\text{MEX} 每次最少增加1,所以显然对 MEX\text{MEX} 操作更优,那么 MEX\text{MEX} 值就已定了

考虑对 MEX\text{MEX} 操作时如何使得 DIFF\text{DIFF} 变化最小

假如我们从1个位置移到另一个位置, DIFF\text{DIFF} 不变

CF1671E

考虑两个子树交换不产生新贡献的情况

那么显然,这两子树AB数量必然相等。反推过来,两子树AB数量不等交换必然产生新贡献

思考后我们可以尝试推广,我们对所有可操作数的数量从小到大排序,按顺序操作即可

于是设 fif_i 表示以 ii 为根子树的方案数,SiS_i 表示以 ii 为根子树内 A 的个数

SxS_x 直接树形dp即可,fxf_x 状态状态转移如下:

  • Slx=SrxS_{lx}=S_{rx},则 fx=flx×frxf_x=f_{lx}\times f_{rx}
  • SlxSrxS_{lx}\ne S_{rx},则 fx=2flx×frxf_x=2f_{lx}\times f_{rx}

f1f_1 即为所求

CF1668D

fif_i 表示以 ii 结尾最大贡献,sis_i 表示前缀和,显然可以列出一个dp:

fi=max{fj    (sj=si)fj+(ij)    (sj<si)fj(ij)    (sj>si)f_i=\max{}\left\{\begin{matrix} f_j\;\;(s_j=s_i) \\ f_j+(i-j)\;\;(s_j<s_i) \\ f_j-(i-j)\;\;(s_j>s_i) \end{matrix}\right.

第一个式子显然可以用个map来维护,然后看后两个式子,我们可以把和 jj 有关的放一起,那就是 fjj+if_j-j+ifj+jif_j+j-i

ii 显然可以后面处理,然后拿个单调栈维护就行,2式栈底到栈顶满足 ss 从小到大,3式就是从大到小

CF1666J

考虑区间dp

dp(l,r)dp(l,r) 表示一个子树包含 [l,r][l,r] 的最小代价

显然我们要枚举一个根节点 kk,然后左右子树可以先分别统计贡献 dp(l,k1)+dp(k+1,r)dp(l,k-1)+dp(k+1,r)

然后考虑跨区间的。我们在考虑这个问题之前可以先思考另一个问题,假如 i[l,r]i\notin [l,r] 的话,我们其实可以用个 fl,rf_{l,r} 表示 i[l,r]ljrci,j×dj,k\sum_{i\notin [l,r]}\sum_{l\leq j \leq r} c_{i,j}\times d_{j,k}kk 表示这个区间的根节点)

为了方便转移,我们可以把它当成代价记在 dp(l,r)dp(l,r) 里面

现在重新考虑跨区间问题,我们发现对于 [l,k1][l, k-1][k+1,r][k+1, r] 区间我们只需要考虑新增的两条边了

我们对 cc 做个二维前缀和 SS,那么上面的代价就是 S((l,k+1),(k1,r))×2S\left ( (l,k+1),(k-1,r) \right ) \times 2

然后答案就是 dp(1,n)dp(1,n)

kk 有关的代价随便乱搞一下就行

CF1660F2

考虑每次操作,会让 - 的数量-2,+ 的数量+1,也就是它们之间的差减少3。所以一个区间符合约束,必然是减号数量大于等于加号数量,且它们之间的差为3的倍数。

在这种约束情况下,是否有解呢?可以发现,当减号数量大于加号数量加一时,必然存在两个连续的减号,于是我们就必然存在一种在合法约束条件的构造。

回到原问题。由于是求合法区间个数,不妨先设个前缀和 SSSiS_i 表示前 ii 个符号减号数量减去加号数量的结果。则一个合法区间 [i+1,j][i+1,j] 必然满足以下条件

  1. i<ji<j
  2. SjSi(mod3)S_j\equiv S_i\pmod 3
  3. SjSi0S_j-S_i\geq 0

对于约束1,我们显然可以按顺序处理

对于限制2,我们似乎只需要开一个大小为3的数组即可

但加上限制3呢。其实我们只需要把数组改成树状数组,开3个树状数组维护即可

时间复杂度 O(nlogn)O(n\log n)

CF1654D*

首先按照题目约束必然是棵树,我们任意定义一个点为根,假设它的分量是 11,则必然每个节点 ii 都可以用最简分数 cidi\dfrac {c_i}{d_i} 来表示它的分量。

要使所有都为整数,根节点至少为 lcmi=1ndi\text{lcm}_{i=1}^nd_i,现在我们就是要求这个值的最小值

我们先推一下转换式子,假设节点 iicidi\dfrac {c_i}{d_i},节点 jjii 的儿子,两个之间的比为 x:yx:y,则 jj 的分量为 ciydix\dfrac {c_iy}{d_ix},,也就是每次相当于是乘上 yx\dfrac{y}{x}

一个常见的套路是维护每个质数个数。必然的,对于任意一个 nn 以内的数,其质因子个数不超过 logn\log n 个。所以对于 x,yx,y 我们可以暴力更新当前分母每个质数的指数(可以为负),然后我们要求的lcm就是在考虑所有情况下的每个质数的指数最大值。

根节点求出来后,显然,每个节点可以直接顺推求出。

时间复杂度 O(nlogn)O(n\log n)

CF1650G

题目就是求 s,ts,t 的最短路与次短路条数。

最短路条数直接bfs一遍可以求出。

次短路的话我们按最短路跑出的层次遍历,第 ii 层的某个节点可以从同层的最短路或第 i1i-1 层的次短路转移过来。

时间复杂度 O(n)O(n)

CF1628D1

博弈论,由于是easy任务,往dp方向考虑。

可以发现,加入前面的已定,后面的情况是独立的。于是可以设 f(i,j)f(i,j) 表示后 ii 个数至少 jj 个加的答案。

必然的,f(i,0)f(i,0) 为0,因为此时Bob必然全出负,Alice为了应对只能出0

对于 f(i,j)f(i,j),我们假设Alice出的是 tt,那么Bob的抉择有两种,+t+tt-t,那么可以推出转移式子:

f(i,j)=min(f(i1,j)t,f(i1,j1)+t)f(i,j)=\min(f(i-1,j)-t,f(i-1,j-1)+t)

易证 f(i1,j1)f(i1,j)f(i-1,j-1)\leq f(i-1,j),随着 tt 变化,f(i1,j)tf(i-1,j)-t 必然单调下降,f(i1,j1)+tf(i-1,j-1)+t 必然单调上升,Alice要使 f(i,j)f(i,j) 最大,显然是取这两个函数的交点,也就是另 t=min(f(i1,j)f(i1,j1)2,k)t=\min(\dfrac{f(i-1,j)-f(i-1,j-1)}2,k)

答案即为 f(n,m)f(n,m),复杂度 O(n2)O(n^2)

CF1626D

为了方便处理,我们可以把相同的合并,变成 mm 段,每段有一个数 aia_i 和权值 wiw_i,此时最终答案相当于是 2X+2Y+2Zn2^X+2^Y+2^Z-n,所以我们的目标就是让 2X+2Y+2Z2^X+2^Y+2^Z 最小。

在不考虑前两段的代价下,最后一段显然 wi\sum w_i 越小就可以使 ZZ 越小,也就是我们可以贪心使前面往后取

但我们需要考虑前两段的代价,但我们可以直接枚举代价 X,YX,Y,显然 X,Y31X,Y\leq 31,于是前两段的最大代价已定,我们就让它尽量往后取,使第三段的代价最小。

复杂度 O(nlog2n)O(n\log^2n)

CF1621D^

右下的正方形是肯定要清理的

考虑左上正方形的四个对角格子,要使其移动,则左下和右上的正方形的各自四个对角格子至少清理一个。

而清理完这个,我们就可以构造出一种方案,使得全部移动到右下正方形,具体可以考虑原先的一行移动成一列。

时间复杂度 O(n2)O(n^2)

CF1614D^

dpidp_i 已构造序列的 gcd\gcdii 的最大值,设 cnticnt_iii 的倍数的个数,则 dpidp_i 初始值为 cnti×icnt_i\times i

考虑转移,枚举上一个 gcdj\gcd j,所以 dpi=maxij(dpj+(cntjcnti)×i)dp_i=\max_{i|j}(dp_j+(cnt_j-cnt_i)\times i)

由于 ii 的倍数均摊下来是 logn\log n 个,所以复杂度为 O(nlogn)O(n\log n)

CF1606E^

dpi,jdp_{i,j} 为剩 ii 个人最大血量为 jj 的方案数,显然,这轮每人减 i1i-1 血量

可以考虑枚举这一轮覆灭 kk 个人,则有 CikC_i^k 种选人方法,这些人的血量可以为 [1,i1][1,i-1]

于是就有 dpi,j=kdpik,jk+1Cik(i1)kdp_{i,j}=\sum_k dp_{i-k,j-k+1}C_i^k(i-1)^kdpn,xdp_{n,x} 即为所求

时间复杂度 O(n3)O(n^3)

CF1605D

可以考虑可移动的两点,其最高位1必然相同(否则最高位min值为0,1与0异或值为1),可以发现这是个充要条件

考虑每个点都无法移动,由于任何2的整数幂最多占原数的一半,所以必然存在这样的构造

复杂度 O(n)O(n),可能带个 log\log

CF1599H

先考虑求下边界,询问整个棋盘左下和右下的距离

然后通过移动距离长的到某个地方,使两点到矩形左右边界距离一样

取其终点询问,其距离就是到下边界的距离

剩下两个边界同理,共询问8次

CF1593F

dp(i,a,b,k)dp(i,a,b,k) 表示前 ii 个字符凑的数模 AAaa,模 BBbb,且染成红色的数量比染成黑色数量多 kk 是否可行

转移考虑枚举这个数染红还是染黑

  • 染红,转移至:dp(i,(10a+si)modA,b,k+1)dp(i,(10a+s_i)\bmod A,b,k+1)
  • 染黑,转移至:dp(i,a,(b10+si)modB,k1)dp(i,a,(b*10+s_i)\bmod B,k-1)

答案就是,dp(i,0,0,k)dp(i,0,0,k) 为1时 k|k| 的最小值,输出方案记录一下由哪里转移过来即可

CF1575L

dpidp_i 表示前 ii 个数中 aia_i 生效的最长长度,显然有 dpi=maxdpj+1dp_i=\max dp_j+1

考虑 jj 要满足什么条件,显然 ai>aja_i>a_j,而且中间的数必须足够,即 aiajija_i-a_j\leq i-j,移项得 iaijaji-a_i\geq j-a_j

还有个隐藏条件 i>ji>j,综合起来就是:

  • i>ji>j
  • ai>aja_i>a_j
  • iaijaji-a_i\geq j-a_j

显然cqd

(其实结合后两个条件可以推出第一个条件,所以其实二维偏序即可)

CF1560F2

对于一个数,从大往小处理,假如某个次数出现超过 kk 次,就这个数加1(进位照常),后面全改0,然后从头来过

CF1555E

显然先双指针,对已定最小值求当前最小最大值

然后拿个线段树来就行,支持区间加和区间最小值

时间复杂度 O(nlogm)O(n\log m)