CF1738E Balance Addicts
2024-10-21 02:51:10
个人思路:
\(sum_i\) 表示前 \(i\) 个数的前缀和,推一下式子可知是要选若干对 \(l_i,r_i\),使得 \(l_1 < l_2 <\dots < l_k \le r_k < \dots < r_2 < r_1\) 且 \(sum_{l_i} + sum_{r_i} = sum_n\times 2\)。
然后就不会做了。
正解:
\(pre_i\) 表示 \([1,i]\) 的和,\(suf_i\) 表示 \([i+1,n]\) 的和,题目等价于选若干对 \(l_i,r_i\),使得 \(l_1 < l_2 <\dots < l_k \le r_k < \dots < r_2 < r_1\) 且 \(pre_{l_i} = suf_{r_i}\)。
上面的做法遗漏了 \(a_i \le 0\),所以 \(pre_i\) 和 \(suf_i\) 分别为从左往右单增和从右往左单增,不同的值成独立段。
显然,对于一个段 \([l_l, l_r]\) 和 \([r_l, r_r]\),枚举选的对数 \(p\),贡献为 \(\sum\limits_{0 \le p \le min(l_r-l_l+1, r_r-r_l+1)} C_{l_r-l_l+1}^p \cdot C_{r_r-r_l+1}^p\)。
所有段贡献的乘积即为答案。
但是如果 \([l_l, l_r]\) 与 \([r_l, r_r]\) 重合,需要特判。发现此时任选位置切割,一定满足回文,贡献为 \(2^{l_r - l_l + 1}\)。
时间复杂度 \(\Theta(n)\)
最新文章
- Angular2 架构
- JavaScript学习笔记——基本知识
- POJ 1528问题描述
- django中的filter详解
- PHP正值表达式
- jQuery autoResize
- find查找命令
- php的laravel数据库版本管理器migration
- 自学Zabbix3.8.1.2-可视化Visualisation-Graphs自定义图表
- 20170310 - Python 3 下 SQLAlchemy 的 MySQL 数据库 URI 配置
- Spring流行的十大理由
- Component(组件)
- ABP框架系列之十:(Application-Services-应用服务)
- eclipse 打包
- Maven 工程读取resource下的文件
- poj1182(带权并查集)
- IOS视频播放器的制作
- poj1981 Circle and Points
- 如何快速选中某单元格所在的整行或整列 Excel教程
- 腾讯云AI平台张文杰:构建一站式机器学习服务平台