洛谷题面传送门 & 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. PG集群(PostgreSql环境)搭建

    centos PG集群搭建 一.安装PG 1.安装之前首先查看软件是否已经安装 rpm -qa | grep postgresql #若存在,需要卸载使用 yum remove postgresql ...

  2. Golang通脉之包的管理

    在工程化的开发项目中,Go语言的源码复用是建立在包(package)基础之上的. 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言提供了很多内置包,如fmt.os.io等. ...

  3. SpringCloud微服务实战——搭建企业级开发框架(四):集成SpringCloud+SpringBoot

    1.在GitEgg工程的根目录,最上级父pom.xml文件中引入需要依赖的库及Maven插件,设置编码方式: <!--?xml version="1.0" encoding= ...

  4. 974.和可被K整除的子数组

    题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满足其元 ...

  5. [hi3521] nand flash 的 boot 启动模式的区别?

    spi nand flash 的 boot 启动模式选择.0:1 线 boot:1:4 线 boot.请问,1线boot和4线boot有什么区别呢?该如何选择呢?     收藏 顶 踩   回复 使用 ...

  6. series和读取外部数据

    1.为什么学习pandas 我们并不是不愿意学习新的知识,只是在学习之前我们更想知道学习他们能够帮助我们解决什么问题.--伟哥 numpy虽然能够帮助我们处理数值,但是pandas除了处理数值之外(基 ...

  7. MyBatis源码分析(六):Spring整合分析

    一.Mybatis-Spring源码结构 二.Myabtis交给Spring管理的组件 1. dataSource 数据源 配置一个数据源,只要是实现了javax.sql.DataSource接口就可 ...

  8. Java并发:ReadWriteLock 读写锁

    读写锁在同一时刻可以允许多个线程访问,但是在写线程访问,所有的读线程和其他写线程均被阻塞. 读写锁不像 ReentrantLock 那些排它锁只允许在同一时刻只允许一个线程进行访问,读写锁可以允许多个 ...

  9. 对SQLServer错误使用聚集索引的优化案例(千万级数据量)

    前言: 半个月前发了文章 SQLServer聚集索引导致的插入性能低 终于等到生产环境休整半天,这篇文章是对前文的实际操作. 以下正文开始: 异常:近期发现偶尔有新数据插入超时. 分析:插入条码有多种 ...

  10. udev 使用方法

    原文地址 http://blog.163.com/againinput4@yeah/blog/static/122764271200962305339483/ 最近有在研究SD卡设备节点自动创建及挂载 ...