个人思路:

\(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)\)

最新文章

  1. Angular2 架构
  2. JavaScript学习笔记——基本知识
  3. POJ 1528问题描述
  4. django中的filter详解
  5. PHP正值表达式
  6. jQuery autoResize
  7. find查找命令
  8. php的laravel数据库版本管理器migration
  9. 自学Zabbix3.8.1.2-可视化Visualisation-Graphs自定义图表
  10. 20170310 - Python 3 下 SQLAlchemy 的 MySQL 数据库 URI 配置
  11. Spring流行的十大理由
  12. Component(组件)
  13. ABP框架系列之十:(Application-Services-应用服务)
  14. eclipse 打包
  15. Maven 工程读取resource下的文件
  16. poj1182(带权并查集)
  17. IOS视频播放器的制作
  18. poj1981 Circle and Points
  19. 如何快速选中某单元格所在的整行或整列 Excel教程
  20. 腾讯云AI平台张文杰:构建一站式机器学习服务平台

热门文章

  1. JavaScript:函数:函数的参数
  2. [编程基础] Python列表解析总结
  3. [OpenCV实战]29 使用OpenCV实现红眼自动去除
  4. BatteryStatsHelper.java源码分析
  5. 【原创】linux实时应用如何printf输出不影响实时性?
  6. (18)go-micro微服务ELK介绍
  7. vue 解决循环引用组件/动态组件/组件未注册报错
  8. java进阶P-2.7
  9. 互斥锁、线程理论、GIL全局解释器、信号量、event事件、进程池和线程池以及协程
  10. MD5在Python中的简单使用