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 [题解]关键在于快速判断一个字符子串是否合法,容易发现合法仅 ...
随机推荐
- 脚本注入1(boolean&&get)
现在,我们回到之前,练习脚本支持的布尔盲注(get型). 布尔盲注的应用场景是查询成功和失败时回显不同,且存在注入点的地方. 这里以Less-8为例: 发现查询成功时,会显示:失败则无回显. 同时发现 ...
- 关于qmake的install
在pro的构建系统中可以设置INSTALLS变量,在make命令之后,执行make install命令触发,将想要的资源拷贝到相应的目录,参考qwt的构建体系,在qwt.pro末尾有这么几句 qwts ...
- 常用JAVA API :String 、StringBuilder、StringBuffer的常用方法和区别
摘要 本文将介绍String.StringBuilder类的常用方法. 在java中String类不可变的,创建一个String对象后不能更改它的值.所以如果需要对原字符串进行一些改动操作,就需要用S ...
- 深度解析HashMap集合底层原理
目录 前置知识 ==和equals的区别 为什么要重写equals和HashCode 时间复杂度 (不带符号右移) >>> ^异或运算 &(与运算) 位移操作:1<&l ...
- 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序
上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...
- Envoy实现.NET架构的网关(五)集成Redis实现限流
什么是限流 限流即限制并发量,限制某一段时间只有指定数量的请求进入后台服务器,遇到流量高峰期或者流量突增时,把流量速率限制在系统所能接受的合理范围之内,不至于让系统被高流量击垮.而Envoy可以通过e ...
- SpringCould | Nacos与Feign
服务注册Nacos 介绍 概念 一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos: Dynamic Naming and Configuration Service Nac ...
- elasticsearch中query_string的隐藏坑
elasticsearch查询中使用filter查询添加query_string格式为: { "query_string": { ...
- 蓝图before request
方法1 @bp.before_request def test(): print("test") 方法2 def bp_before_request(): print(test) ...
- selenium基本使用,及cannot find chrome binary解决方案
什么是selenium? Selenium是一个用于Web应用程序测试的工具. Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样. 支持通过各种driver(FirfoxDriver ...