洛谷题面传送门 & Atcoder 题面传送门

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)的更多相关文章

  1. Atcoder CODE FESTIVAL 2017 qual B D - 101 to 010 dp

    题目链接 题意 对于一个\(01\)串,如果其中存在子串\(101\),则可以将它变成\(010\). 问最多能进行多少次这样的操作. 思路 官方题解 转化 倒过来考虑. 考虑,最终得到的串中的\(' ...

  2. CODE FESTIVAL 2017 qual B D 101 to 010(dp)

    除非人品好,能碰巧想到思路,否则基本是做不出来dp的,除了那几个经典的dp模型.. 看了几个前几名的代码,还是t神的代码比较清晰.膜tourist 代码的思路和题解思路基本一致..... #inclu ...

  3. CODE FESTIVAL 2017 qual B C 3 Steps(补题)

    总感觉这题是个题意杀,理解错题目了,看了好久才发现题目意思:操作是让,只要两点没有直接相连,而且只要有一条路的距离3,就可以把这两点连接起来. 按照题解中讲的,可以把图分为二分图和非二分图来解.不过题 ...

  4. CODE FESTIVAL 2017 qual A D Four Coloring(补题)

    这题看了好几天才看懂,一直误解题解中的d * d了 题解中说把大的格子划分成d * d的方格,我划分的时候把格子当作点来算的,一直觉得那明明是(d-1) * (d-1),昨天刚反映过来 思路:把格子旋 ...

  5. CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】

    CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...

  6. CODE FESTIVAL 2017 qual B C - 3 Steps【二分图】

    CODE FESTIVAL 2017 qual B C - 3 Steps 题意:给定一个n个结点m条边的无向图,若两点间走三步可以到,那么两点间可以直接连一条边,已经有边的不能连,问一共最多能连多少 ...

  7. [AtCoder Code Festival 2017 QualB D/At3575] 101 to 010 - dp

    [Atcoder Code Festival 2017 QualB/At3575] 101 to 010 有一个01序列,每次可以选出一个101,使其变成010,问最优策略下能操作几次? 考虑像 11 ...

  8. 【AtCoder】CODE FESTIVAL 2017 qual C

    A - Can you get AC? No #include <bits/stdc++.h> #define fi first #define se second #define pii ...

  9. 【Atcoder】CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning

    [题意]给定只含小写字母的字符串,要求分割成若干段使段内字母重组顺序后能得到回文串,求最少分割段数.n<=2*10^5 [算法]DP [题解]关键在于快速判断一个字符子串是否合法,容易发现合法仅 ...

随机推荐

  1. 小白自制Linux开发板 七. USB驱动配置

    本文章基于https://whycan.com/t_3087.htmlhttps://whycan.com/t_6021.html整理 F1c100s芯片支持USB的OTG模式,也就是可以通过更改Us ...

  2. Less-(1~4) union select

    Less-1: 核心语句: 无任何防护:回显查询结果或错误内容. 输入单引号闭合语句中的单引号,#注释后面的内容,即可注入.由于有查询结果回显,直接联合注入即可. 1'order by x #(有些环 ...

  3. 【UE4 设计模式】组件模式 Components Pattern

    概述 描述 在单一实体跨越了多个领域时,为了保持领域之间相互解耦,可以将每部分代码放入各自的组件类中,将实体简化为组件的容器. 套路 参考 UE4中的 Componet 组件使用方式 使用场景 有一个 ...

  4. 解决git clone慢问题

    解决git clone慢 关于Git克隆或是上传代码龟速的问题真是让人很恼火,这里对于网上的两种解决方案进行摘录. 利用码云克隆github项目 亲测有效 进入码云,新建一个仓库: 在创建的最后选择导 ...

  5. Spark面试题(二)

    首发于我的个人博客:Spark面试题(二) 1.Spark有哪两种算子? Transformation(转化)算子和Action(执行)算子. 2.Spark有哪些聚合类的算子,我们应该尽量避免什么类 ...

  6. 鸿蒙轻内核M核的故障管家:Fault异常处理

    摘要:本文先简单介绍下Fault异常类型,向量表及其代码,异常处理C语言程序,然后详细分析下异常处理汇编函数实现代码. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十八 Fault异常处理& ...

  7. opencv学习(一)——图像入门

    图像入门 一.读取图像 在opencv中使用cv.imread(filename, flags)函数读取图像.filename参数表示读取图像的路径.读取图像的路径应完整给出,且不能含有中文,否则在调 ...

  8. ASP的调试技术解答

    一. 调试 ASP.NET 应用程序时出现"未将项目配置为进行调试"的错误信息 症状 当您在 Visual Studio .NET 中调试 ASP.NET 应用程序时,可能会出现下 ...

  9. linux命令中find, which、whereis、locate,有什么区别?

    whatis 用于查询一个命令执行什么功能,并将查询结果打印到终端上 which 查看可执行文件的位置 whereis 查看文件的位置 man Linux提供了丰富的帮助手册,当你需要查看某个命令的参 ...

  10. hdu 2176 取(m堆)石子游戏 (裸Nim)

    题意: m堆石头,每堆石头个数:a[1]....a[m]. 每次只能在一堆里取,至少取一个. 最后没石子取者负. 先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法.如果从有a个 ...