当前位置: 首页 > news >正文

CF2150D

挺有意思的计数题,希望下次可以做出来类似的题目。

一个显然的转化是把 \(p\) 数组转换成记录每个位置的人数的 \(f\) 数组,于是我们需要求每种情况下的 \(\sum f_i a_i\)

首先需要一些观察,初始 \(f\) 数组每个位置都是 1 ,放置 attraction 的操作相当于把连续的三个值 merge 起来,并且在左右补上 0 ,归纳一下就很容易发现 \(f\) 数组合法当且仅当:

  • \(\exists L,R \in [1,n] \ s.t. L \leq R, \forall i\in [L,R] f_i>0 ,\forall i \notin [L,R] f_i=0\)

  • \(\forall i \in (L,R) f_i \mod 2 =1\)

  • \(\sum f_i =n\)

假设我们枚举出 \(R-L+1=K\) ,一个很巧妙的想法是利用除了端点的 \(f_i\) 都是奇数这一点构造一个和 \(f\) 一一对应的 \(g\) 数组,其中

  • \(f_L=2g_L+x\)

  • \(f_R=2g_R+y\)

  • \(\forall i\in (L,R) f_i=2g_i+1\)

这样的好处是,此时的 \(g\) 数组只有 \(\sum 2g=n-(K-1)-x-y\) 的限制,这是我们会做的形式。

现在要求所有情况下的 \(\sum g_i a_i\) 再加上一些和 \(x,y\) 有关的东西。

当然可以推式子,但一个比较简单的想法是:我们先假设固定了左右端点,观察到中间这些位置本质相同,所以 \(E(g_i)=\frac{S}{2K}\)\(\sum g_i a_i=\sum E(g_i) a_i \times ways\)
\(ways\) 表示这 \(K\)\(g\) 的分配方案(插板法)。

于是对于左右端点不固定的情况,我们只需要算出来所有长度为 \(K\) 的子串和就可以很方便地处理,时间复杂度线性或者带一个 \(\log\)

http://www.hskmm.com/?act=detail&tid=22695

相关文章:

  • AI元人文:致同行者书
  • tp5 基础nginx伪静态
  • 异或运算的一个小等式
  • AI元人文:“现实与价值”的生态——走向一种基于博弈与演化的协同智能
  • 169. 多数元素
  • Ai元人文:最后的客观与乐观
  • AI元人文:价值原语构想——迈向动态博弈的价值生态
  • 《多分支条件判断优化:switch-case 结构的技术价值分析》
  • Codeforces 1385G Columns Swaps 题解 [ 蓝 ] [ 扩展域并查集 ] [ 二分图最大权匹配 ] [ 基环树建模 ]
  • 72. 编辑距离
  • PlantUML 完整教程:从入门到精通
  • 你妈的
  • test6
  • test7
  • 学习java的第三天
  • vscode github 推送失败
  • 信奥大联赛周赛(提高组)#2515-S 赛后盘点
  • 虚拟机仅主机模式下使用ssh远程连接Linux(EHEL8)连接慢,需要等待30秒以上
  • VLC Player插件和自动激活
  • 第七天
  • logback.xml 常用配置详解 - Higurashi
  • MySQL COUNT(*)性能对比:MyISAM为何比InnoDB快?全面解析与优化方案
  • 2025.10.1总结
  • 子结构判断
  • 使用 Go 进行验证码识别
  • 使用 Rust 进行验证码识别
  • 使用 Swift 进行验证码识别
  • torchtext与torch版本对应关系
  • Python错题集
  • 火狐浏览器新页覆盖旧页解决方法