2023.02.04 模拟赛小结

更好的阅读体验戳此进入

赛时思路

T1

给定序列 ai,将序列的位置 i 染色将会获得 ai 的贡献,但要求对于任意两个染色的位置 i,j 满足 aiaj,同时对于连续 m 个未染色的位置会失去 m(m+1)2 的贡献,最大化贡献,求最大值。

emm 第一眼想到的是 2D0D 的 DP,就是设 dp(i,j,0/1) 表示前 i 个最后染色的价值为 j 然后末尾是否染色,这个东西离散化一下理论是 O(n2) 的,然后发现无法转移,想到添加一维 k 表示末尾连续多少个未染色的,想转移时发现 j0/1 就没用了,于是最终 2D0D 的 DP 是令 dp(i,j) 表示前 i 个结尾连续 j 个未染色的最大贡献,转移显然:

dp(i,0)=maxj[0,i1],aiaij1dp(i1,j)+ai
dp(i,j)=dp(i1,j1)+(j1)j2j(j+1)2(j0)

后者整理得:

dp(i,j)=dp(i1,j1)j

前者二维偏序可以优化到 O(n),后者发现化简完似乎并没有什么优化的方式,于是寄掉,最终 41pts

Upd:也可以强行优化,发现 dp(i,j)(j0) 都可以 O(1) 求,对于 dp(i,0) 的转移将后者所有全部转化为 dp(j,0)+C 的形式,此时就和 1D1D 的方程十分相似,二维偏序然后 cdq 维护一下即可。

Code

T2

给定字符串 S,存在 n2 次修改操作,第 i 次会将 i+1 的字符变为 wi,每次求最长回文子串,包括未修改时,求出对于所有答案中最大值。

基于 LG-P4324 [JSOI2016]扭动的回文串 修改的。

赛时一看默认这是 PAM 之类的东西(犇犇 @sssmzy 真的写了个 PAM)于是就跳了,写了个 O(n) 预处理前缀后缀哈希,O(n2) 枚举子串 O(1) 验证共做 O(n) 次的 O(n3),于是寄掉了,最终 30pts

正解真的巨简单

Code

T3

还算是相对比较接近切掉的一道题。

给定序列 xn,给定 k,T,每次操作会使其变为序列 yn 满足:

yi=j=0k1x(i+j)modn

求操作 T 次后的序列。

Tips:序列下标从 0 开始。

手画一下,例如 k=3,一次操作大概是其之后连续 3 个数亦或起来,即 1,1,1,两次后就是 1,0,1,0,1,即第 1,3,5 亦或起来,发现似乎就是将 1,1,1 多项式乘法乘上 T 次,然后将 n 之外的部分类似 P3321 [SDOI2015]序列统计 去覆盖上去即可,这个东西只能用两只 log 的多项式快速幂,此处复杂度 O(nlognlogT),最终赋值复杂度 O(n2),可以通过 50pts80pts,当然我最终得到 50

Code

正解

T1

简单设一个 1D1D 的 DP 然后斜率优化十分显然,偏序部分套个 CDQ 即可,复杂度 O(nlogn)

T2

就是个哈希,类比一下原题就行,分割成中间的回文串和左右相同的两串,中间回文串满足单调性,跑一下即可。

另外对于一般的哈希也是满足单调性的,枚举每一个中点然后取最大值并令其不降最终就是 O(n) 的。

T3

考虑最终将二进制拆位并 NTT 即可,此时就能几乎拿满了。对于过程中会发现有一些难以想到的性质,emm 大概就是能推成一个新的柿子,然后就能优化,emmmmmm 这个东西吧。。反正很奇怪就对了。

代码实现就先都咕着了。

UPD

update-2023_02_04 初稿