Atcoder AGC031B Reversi (DP计数)

简单的计数题。(总算做出一道AGC的B题了,然而这场比赛我忘记打了233333)

题目链接: https://atcoder.jp/contests/agc031/tasks/agc031_b

题意: 有一个长度为\(N\)的颜色序列,第\(i\)个位置初始颜色为\(a_i\), 可以执行若干次操作,每次可以选择两个颜色一样的位置,然后把这两个位置中间的区间都刷成和两端相同的颜色,问最后本质不同的序列有多少种。

题解: 最重要的想法就是要深刻地理解本质不同。

因为我们不论如何操作,最后得到的序列一样就算一样,所以假设\([l_1,r_1]\)和\([l_2,r_2]\)分别是先后两次操作。

若前者和后者相交但不包含,若前后两次刷成的颜色相同,我们可以等效成一次操作,操作区间为它们的并。(等效法?文化课走火入魔了吧)若前后两次颜色不同,那么这种情况一定是不存在的,因为相交但不包含意味着第一个区间的一个端点在第二个区间里,那这个端点在执行完前面的操作之后就不再是颜色2而变成颜色1了。

若前者包含后者,则后者无用。

若后者包含前者,则前者无用。

若两次区间不相交,则两次都有用。

所以本题就是要求把长度为\(N\)的序列内取出若干不相交区间,每个区间两端点颜色相同的方案数。

我们先对序列进行如下处理: 把所有连续的颜色相同的区间缩成一个位置。例如122333441变成12341.

然后\(f_i\)表示前\(i\)个的方案数。

\(f_i=\sum_{j\le i, a_j=a_i} f_{j-1}\)

桶优化。

时间复杂度\(O(n)\).

特发此文,假装自己还没AFO。

代码

好长啊,500多B.


#include<cstdio>
#include<cstdlib>
#include<cstring>
#define llong long long
using namespace std;const int N = 2e5;
const int P = 1e9+7;
int a[N+3],b[N+3];
llong f[N+3],g[N+3];
int n;int main()
{scanf("%d",&n);for(int i=1; i<=n; i++) scanf("%d",&a[i]);int m = 0; for(int i=1; i<=n; i++) if(i==0 || a[i]!=a[i-1]) {m++; b[m] = a[i];}n = m; for(int i=1; i<=n; i++) a[i] = b[i];f[0] = 1ll; g[a[1]] = 1ll;for(int i=1; i<=n; i++){f[i] = g[a[i]];g[a[i+1]] = (g[a[i+1]]+f[i])%P;}printf("%lld\n",f[n]);return 0;
}

发表于 2019-03-17 00:01 suncongbo 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部

Atcoder AGC031B Reversi (DP计数)相关推荐

  1. AtCoder AGC035E Develop (DP、图论、计数)

    题目链接 https://atcoder.jp/contests/agc035/tasks/agc035_e 题解 没想出来最后一步DP宛如智障-- 考虑一个数\(x\notin S\)的条件是\(x ...

  2. F - Tmutarakan Exams URAL - 1091 -莫比乌斯函数-容斥 or DP计数

    F - Tmutarakan Exams 题意 : 从 < = S 的 数 中 选 出 K 个 不 同 的 数 并 且 gcd > 1 .求方案数.   思路 :记 录 一 下 每 个 数 ...

  3. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  4. 2019 GDCPC or HDU6540 树形dp[计数dp] 详解

    题目链接 题目大意: 就是给你一颗nnn个点的树,树上有mmm个关键点,你可以选择若干个关键点组成集合SSS,这个集合满足任意两点在树上的距离不超过kkk,问你有多少种选法? 解题思路: 我们考虑树形 ...

  5. Codeforces 997D Cycles in Product (点分治、DP计数)

    题目链接 https://codeforces.com/contest/997/problem/D 题解 点分治这个思路想不到== 首先这两棵树的笛卡尔积并没有什么用处,因为笛卡尔积中的环就是两棵树中 ...

  6. Stone game(dp计数上海icpc网络预选赛)

    题目链接 都说是很简单的dp,可能对于会dp的人来说确实是很简单的dp.但是我们队一个会的也没有,太菜了.. 根据题目的要求,我们只需要枚举当前的最小值,那么我们由大到小排序,然后倒着找,这样当前值一 ...

  7. 【计蒜客信息学模拟赛1月月赛 - D】Wish(dp计数,数位)

    题干: 如果一个数大于等于 10且任意连续两位都是质数,那么就称之为 Wish 数.当然,第一个 Wish 数是 11. 比如 97,111,131,119 都是 Wish 数,而 12,136 则不 ...

  8. 【vijos】1770 大内密探(树形dp+计数)

    https://vijos.org/p/1770 不重不漏地设计状态才能正确的计数QAQ 虽然可能最优化是正确的,但是不能保证状态不相交就是作死.... 之前设的状态错了... 应该设 f[i][0] ...

  9. ZOJ3380- Patchouli's Spell Cards(概率DP+计数)

    Patchouli's Spell Cards Time Limit: 7 Seconds      Memory Limit: 65536 KB Patchouli Knowledge, the u ...

最新文章

  1. http android下载工具,Android实现下载工具的简单代码
  2. 01爬虫基本原理及Requests库下载
  3. 看漫画就能学SQL,简直太cool了
  4. leetcode 打印_LeetCode第118号问题:杨辉三角
  5. 分子计算机已经问世,纳米计算机指日可待?
  6. Flesch Reading Ease(模拟)
  7. php无嵌套遍历多维数组,不递归怎么遍历多维数组(维数不定)
  8. 为什么preparedstatement能防止sql注入_使用Python防止SQL注入攻击的实现示例
  9. 潘多拉路由器php,Padavan潘多拉固件ap模式openwrt固件应该如何设置有线AP模式
  10. Kubernetes (K8s)安装部署过程(一)之证书安装
  11. java毕业答辩_Java毕业设计答辩技巧
  12. python测试开发面试题带答案整理
  13. Android流畅度总结
  14. Ubuntu系统切换jdk版本
  15. phaser3适配微信小游戏
  16. Linux的recovery分区编译,Recovery移植之高级小白教程——Recovery的编译
  17. arcade 读取地图信息时:错误: ‘gbk‘ codec can‘t decode byte 0x91 in position 314: illegal multibyte sequence
  18. 精彩回顾|2019决策易“绩效驱动,团队赋能”大会圆满落幕
  19. 钢铁厂计算机相关岗位需要倒班吗,3个钢铁厂员工血泪史:宁愿工资少一点,千万别上夜班...
  20. 客户关系管理系统PRD编写

热门文章

  1. 成为梵高、毕加索?你最喜欢的人脸识别与神经风格迁移来啦!
  2. io python_python学习笔记 - StringIO以及BytesIO
  3. 踩内存是什么意思啊_Win10任务管理器中的quot;共享GPU内存quot;是什么意思?
  4. C++Primer:函数(参数传递:引用形参)
  5. mint-UI引用后样式不对
  6. main 函数解析(二)—— Linux-0.11 学习笔记(六)
  7. 【❗JS奇技淫巧❗】JavaScript:截取DataURL中的base64字符串
  8. Spring IOC 核心流程浓缩
  9. PyTorch基础(四)-----数据加载和预处理
  10. S5PV210开发 -- 前言