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 [题解]关键在于快速判断一个字符子串是否合法,容易发现合法仅 ...
随机推荐
- Boost Started on Unix Variants
- 洛谷 P2680 [NOIP2015 提高组] 运输计划
链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...
- Python:Ubuntu上出现错误 Could not load dynamic library 'libnvinfer.so.6' / 'libnvinfer_plugin.so.6'
运行一个py文件,出现如下的错误,原因是没有找到 libnvinfer.so.6 相关库的文件. 1 2021-01-04 18:41:17.324477: W tensorflow/stream_e ...
- AXI协议中的模棱两可的含义的解释(Cachable和Bufferable)
转载:https://blog.csdn.net/hit_shaoqi/article/details/53243173 Cachable和Bufferable 一个Master发出一个读写的requ ...
- 20191310李烨龙作业:MySort
作业:MySort 任务详情 1. 用man sort 查看sort的帮助文档 2. sort常用选项有哪些,都有什么功能?提交相关使用的截图 3. 如果让你编写sort,你怎么实现?写出伪代码和相关 ...
- sudo user1账号获得管理员root的权限
user1虽然有sudo权限,但不是真正的root权限,修改内核参数之类的就做不了 但是有sudo权限就可以添加账号,以下添加了admin账号与root账号一样的权限 useradd -u 0 - ...
- CentOS7自动备份oracle数据库
1.环境 操作系统:CentOS 7 数据库:11.2.0.1.0 2.登录服务器 切换oracle用户,备份需要在oracle用户下进行 #su - oracle 在oracle家目录下创建bin目 ...
- Win10自动备份oracle数据库
1.环境 操作系统:win10 数据库: 2.创建backup.bat文件 [ @echo offset name=%date:~0,4%%date:~5,2%%date:~8,2%set backu ...
- 云知声 Atlas 超算平台: 基于 Fluid + Alluxio 的计算加速实践
Fluid 是云原生基金会 CNCF 下的云原生数据编排和加速项目,由南京大学.阿里云及 Alluxio 社区联合发起并开源.本文主要介绍云知声 Atlas 超算平台基于 Fluid + Alluxi ...
- .Net Core微服务——网关(1):ocelot集成及介绍
网关是什么 简单来说,网关就是暴露给外部的请求入口.就和门卫一样,外面的人想要进来,必须要经过门卫.当然,网关并不一定是必须的,后端服务通过http也可以很好的向客户端提供服务.但是对于业务复杂.规模 ...