Codeforces Div.2 979 E-G

E

这个最大分值显然是:设 c[i] 为元素 i 的出现次数,做前缀 min,然后求和

考虑到我们只关心各个元素的出现次数,那么设原本序列是 cnt,子序列的是 b

则需要乘上一个组合数 (cnt[i]b[i])

fi,j 为元素 [0,i],出现次数前缀 min 现在是 j 的方案数的分数总和

gi,j 为方案数

首先这个状态需要满足 (i+1)×j<=n,则调和级数状态数

然后转移只需要枚举当前选多少个例如选 t 个就有

fi,j×C(cnt[i+1],t)+gi,j×min(j,t)C(cnt[i+1],t)fi,min(t,j)

可以前缀和优化转移

F

发现出现 xyxy 这种东西就没了,而且答案具有单调性

所以我们可以考虑双指针求 mnlr

这是简单的,我们找到 r 前面第一个 ar,判断有没有数“跨过它”即可。至于更前面的与 ar 相同的数字已经在更前面判断过了。

也就是我们对于每个位置维护 nxti 表示下一个与 ai 相同的数的位置,没有则设置为 ilsti 是上一个 ai 相同的数的位置,我们维护 r,nowl,最初都是 1,执行以下操作:

  • nowllstr1,则判断是否 maxnxtnowllstr1>lstr,如果有则增加 nowl,重复,否则跳出

利用线段树维护即可。

G

考虑到一个策略:

  • 取出 lmax,rminlmaxrmin 则已经合法,跳出

  • 删去这两个区间,代价加上 lmaxrmin 重复

    这里保证了这两个区间修改后相交的条件,并且最终的合法区间一定在这个区间里面,用这个操作是充分且必要的

考虑两区间 [li,ri],[lj,rj],默认 lj>ri

设有 a 个区间满足 l>ljb 个区间满足 r<ri,且不是这两个区间,则总方案数是:

(ax)(bx)2nab2=(a+ba)2nab2


考虑加速计算。

l 递减排序,将 r 递增排序,则可以求出一个 ci 表示 jcir 都是可以用的,那么我们先计算 li 贡献系数,有:

j=1ci(i1+j1i1)2nij=2nij=1ci(i1+j1i1)2j=2ni1j=0ci1(i1+jj)2j

那么我们只需要专心计算:

f(x,y)=j=0y(x+jj)2j=j=0y(x+j1j)2j+(x+j1j1)2j=f(x1,y)+21f(x,y1)=f(x1,y)+21(f(x,y)(x+yy)2y)

由此我们可以 O(1) 地移动 xy

也就是我们可以由 f(x1,y1)|x1x2|+|y1y2| 的时间内得到 f(x2,y2)

而又有我们所求是 f(i1,ci1),第一维不断增大,第二维不断减小,总 1n 变化量 O(n)

这就好了。

f(0,0)=1

同理考虑右端点的贡献即可。


posted @   spdarkle  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示