CODE FESTIVAL 2017 qual C F - Three Gluttons(DP)
DP 好题。
首先考虑如果我们知道 C 吃了哪些寿司,能够还原出多少种符合条件的序列。我们考虑倒着钦定,即,先钦定 A,B,C 三者最后吃的那三个寿司在 \(c\) 中的顺序,显然 C 最后吃的哪个必须在 A,B,C 最后吃的那三个中最先出现,而 A,B 最后吃的那两个寿司的顺序无所谓,有 CAB 和 CBA 两种选择,答案乘以 \(2\)。
再往前一步,我们钦定 A,B,C 倒数第二个吃的那三个寿司在 \(c\) 中的顺序,显然 C 倒数第二个吃的寿司必须在 C 最后吃的寿司之前,而剩下两个可以随便塞,具体来说,A 倒数第二个吃的寿司有 \(4\) 个空位可以插,B 倒数第二个吃的寿司有 \(5\) 个空位可以插,因此答案乘以 \(4\times 5=20\)。
倘若我们再往前推,那么也能得到 C 倒数第三个吃的寿司必须在 C 倒数第二个吃的寿司之前,而 A,B 倒数第三个吃的寿司可以随便插,方案数 \(8\times 7\),倒数第四个吃的寿司也有类似的性质,方案数 \(11\times 10\)……
通过上面的分析我们不难发现,如果确定了 C 吃了哪些寿司,那么合法的序列 \(c\) 可以用一个连乘的形式表示:\(\prod\limits_{i=1}^n(3i-1)(3i-2)\),也就是说我们只用关心有多少种 C 吃寿司的序列,最后答案乘以 \(\prod\limits_{i=1}^n(3i-1)(3i-2)\) 即可。
考虑如何求出有多少种 C 吃寿司的序列,我们假设 A,B 吃寿司在 \(a,b\) 中的下标分别是 \(s_1,s_2,\cdots,s_n,t_1,t_2,\cdots,t_n\),那么可以发现一组 \(s,t,c\) 符合条件当且仅当:
- \(a_{s_1},a_{s_2},\cdots,a_{s_n},b_{t_1},b_{t_2},\cdots,b_{t_n},c_1,c_2,\cdots,c_n\) 中无重复元素,否则就会有寿司被吃两次及以上。
- \(a_{s_i}\) 在 \(a[1…s_i]\cup b[1…t_i]\) 中恰好出现了一次,\(b_{t_i}\) 中也在 \(a[1…s_i]\cup b[1…t_i]\) 中恰好出现了一次,否则 \(a_{s_i}\) 或者 \(b_{t_i}\) 就会在早于 \(i\) 的时间内被吃掉,或者 \(a_{s_i}=b_{t_i}\) 则意味着吃 \(a_{s_i}\) 时 A,B 会发生矛盾。
- \(c_i\) 不能在 \(a[1…s_i]\cup b[1…t_i]\) 中出现过,理由同上。
这样就可以 DP 求出 \(\{c_i\}\) 了。考虑 \(dp_{i,x,y}\) 表示当前已经确定了 \(s_1\sim s_i,t_1\sim t_i\),\(s_i=x,t_i=y\),有多少种可能的 \(c_i\),如果 \(x,y\) 不满足 \(a_x,b_y\) 在 \(a[1…x]\cup b[1…y]\) 中出现恰好一次的条件,那么显然有 \(dp_{i,x,y}=0\),否则我们就枚举它 \(s_{i-1},t_{i-1}\) 的值,即 \(dp_{i,x,y}=\sum\limits_{x’<x}\sum\limits_{y’<y}dp_{i-1,x’,y’}·(3t-|a[1…x]\cup b[1…y]|)\)。后面的 \(3t-|a[1…x]\cup b[1…y]|\) 表示合法的 \(c_i\) 个数。根据“\(a_{s_1},a_{s_2},\cdots,a_{s_n},b_{t_1},b_{t_2},\cdots,b_{t_n},c_1,c_2,\cdots,c_n\)”无重复元素这一条件,\(a[1…x]\cup b[1…y]\) 与 \(a_{s_{i+1}},a_{s_{i+2}},\cdots,a_n,b_{t_{i+1}},b_{t_{i+2}},\cdots,b_{t_n}\) 肯定不交,因此可以拿总元素数 \(3n\) 减去两个集合的大小,可以得到 \(3t-|a[1…x]\cup b[1…y]|\)。用前缀和优化一下可实现 \(\Theta(n^3)\)。
CODE FESTIVAL 2017 qual C F - Three Gluttons(DP)的更多相关文章
- Atcoder CODE FESTIVAL 2017 qual B D - 101 to 010 dp
题目链接 题意 对于一个\(01\)串,如果其中存在子串\(101\),则可以将它变成\(010\). 问最多能进行多少次这样的操作. 思路 官方题解 转化 倒过来考虑. 考虑,最终得到的串中的\(' ...
- CODE FESTIVAL 2017 qual B D 101 to 010(dp)
除非人品好,能碰巧想到思路,否则基本是做不出来dp的,除了那几个经典的dp模型.. 看了几个前几名的代码,还是t神的代码比较清晰.膜tourist 代码的思路和题解思路基本一致..... #inclu ...
- CODE FESTIVAL 2017 qual B C 3 Steps(补题)
总感觉这题是个题意杀,理解错题目了,看了好久才发现题目意思:操作是让,只要两点没有直接相连,而且只要有一条路的距离3,就可以把这两点连接起来. 按照题解中讲的,可以把图分为二分图和非二分图来解.不过题 ...
- CODE FESTIVAL 2017 qual A D Four Coloring(补题)
这题看了好几天才看懂,一直误解题解中的d * d了 题解中说把大的格子划分成d * d的方格,我划分的时候把格子当作点来算的,一直觉得那明明是(d-1) * (d-1),昨天刚反映过来 思路:把格子旋 ...
- CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】
CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...
- CODE FESTIVAL 2017 qual B C - 3 Steps【二分图】
CODE FESTIVAL 2017 qual B C - 3 Steps 题意:给定一个n个结点m条边的无向图,若两点间走三步可以到,那么两点间可以直接连一条边,已经有边的不能连,问一共最多能连多少 ...
- [AtCoder Code Festival 2017 QualB D/At3575] 101 to 010 - dp
[Atcoder Code Festival 2017 QualB/At3575] 101 to 010 有一个01序列,每次可以选出一个101,使其变成010,问最优策略下能操作几次? 考虑像 11 ...
- 【AtCoder】CODE FESTIVAL 2017 qual C
A - Can you get AC? No #include <bits/stdc++.h> #define fi first #define se second #define pii ...
- 【Atcoder】CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
[题意]给定只含小写字母的字符串,要求分割成若干段使段内字母重组顺序后能得到回文串,求最少分割段数.n<=2*10^5 [算法]DP [题解]关键在于快速判断一个字符子串是否合法,容易发现合法仅 ...
随机推荐
- python pip使用国内镜像安装第三方库:命令行或PyCharm
python pip使用国内镜像安装第三方库:命令行或PyCharm 转载: https://blog.csdn.net/lly1122334/article/details/80646996
- 深度剖析Redis6的持久化机制(大量图片说明,简洁易懂)
Redis的强劲性能很大程度上是由于它所有的数据都存储在内存中,当然如果redis重启或者服务器故障导致redis重启,所有存储在内存中的数据就会丢失.但是在某些情况下,我们希望Redis在重启后能够 ...
- CentOS 文本编辑器
目录 1.Nano 1.1.基础命令 1.2.快捷操作 1.3.配置文件 2.Vim 2.1.四大模式 2.2.基础命令 2.3.标准操作 2.4.高级操作 2.5.配置文件 Linux 终端的文本编 ...
- SpringBoot 整合 Thymeleaf & 如何使用后台模板快速搭建项目
如果你和我一样,是一名 Java 道路上的编程男孩,其实我不太建议你花时间学 Thymeleaf,当然他的思想还是值得借鉴的.但是他的本质在我看来就是 Jsp 技术的翻版(Jsp 现在用的真的很少很少 ...
- 占位符,SQL注入?
这两天在上课时被同学拿了一段代码问我,这段代码有什么问题,我看了一会说:Connection和PreparedStatement都没关.他说不止这方面的问题,还有sql注入的问题,我就坚决的说使用了占 ...
- 【二食堂】Beta - Scrum Meeting 1
Scrum Meeting 1 例会时间:5.13 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 查阅资料,解决划词勾选和右键菜单的问题issue2. 修复了Alpha阶段的 ...
- (转载)linux chmod命令用法
chmod----改变一个或多个文件的存取模式(mode) chmod [options] mode files 只能文件属主或特权用户才能使用该功能来改变文件存取模式.mode可以是数字形式(八 ...
- poj 1704 Georgia and Bob (nim)
题意: N个棋子,位置分别是p[1]...p[N]. Georgia和Bob轮流,每人每次可选择其中一个棋子向左移动若干个位置(不能超过前一个棋子,不能超出最左边[位置1]且不能不移) Georgia ...
- 如何减小微信小程序代码包大小
原作于:https://captnotes.com/how_to_reduce_package_size_of_weapp 这两天被小程序代码包大小暴涨的问题困扰了挺久.简单说说怎么回事吧,就是之前好 ...
- 好好的 Tair 排行榜不用,非得自己写?20 行代码实现高性能排行榜
TairZset 是阿里云自研的可实现任意维度 double 类型的分值排序的数据结构,借助 Tair 客户端同时可实现扩展性,即可以将计算任务分布至多个数据节点完成,实现分布式排行榜能力.本文介绍了 ...