题目大意

给出$n$, $p$, 求有多少长度为$n$的排列可以被分成三个上升子序列, 数量对$p$取模,

数据范围 $3 \leq n \leq 500$.

思路

首先让我们考虑如果有一个排列,如何判断这个排列合法,我可以考虑贪心,维护三个上升序列的末尾(最大值),从左到右依次将数插入序列,把这个数贪心的加到它可以加入的末尾的数最大的序列里.

因此考虑dp,定义$f[i][j][k]$表示现在有$i$个数,形成了三个上升子序列,其中最大的子序列末尾显然是第$i$大的数,第二大的子序列末尾是第$j$大的数,第三大的子序列末尾是第$k$大的数,这样的序列的数量,显然,这样枚举是不会重复的,转移的时候,考虑在这个序列末尾加数,考虑加的这个数在这$i$个数中的相对位置,设这个位置为$l$,有

$$

f[i][j][k] \rightarrow f[i+1][j][k],l=i+1 \\

f[i][j][k] \rightarrow f[i+1][l][k],j < l \leq i \\

f[i][j][k] \rightarrow f[i+1][j+1][l], k < l \leq j

$$

一个简单的$O(n^4)$dp

#define add(x, y) x = (x + y >= md) ? x + y - md : x + y
f[1][0][0] = 1;
for (int i = 1; i < n; ++i)
for (int j = 0; j < i; ++j)
for (int k = 0; k <= j; ++k)
if (f[i][j][k] > 0) {
int x = f[i][j][k];
for (int l = k + 1; l <= j; ++l)
add(f[i + 1][j + 1][l], x);
for (int l = j + 1; l <= i; ++l)
add(f[i + 1][l][k], x);
add(f[i + 1][j][k], x);
}

考虑优化,发现转移的都是一段,随便前缀和搞一搞就可以了

#define add(x, y) x = (x + y >= md) ? x + y - md : x + y
#define sub(x, y) x = (x - y < 0) ? x - y + md : x - y
f[1][0][0] = 1;
for (int i = 1; i < n; ++i) {
int cur = i & 1, nxt = cur ^ 1;
memset(f[nxt], 0, sizeof(f[nxt]));
memset(tag1, 0, sizeof(tag1));
memset(tag2, 0, sizeof(tag2));
for (int j = 0; j < i; ++j)
for (int k = 0; k <= j; ++k)
if (f[cur][j][k] > 0) {
int x = f[cur][j][k];
add(tag1[j + 1][k + 1], x);
sub(tag1[j + 1][j + 1], x);
add(tag2[j + 1][k], x);
sub(tag2[i + 1][k], x);
add(f[nxt][j][k], x);
}
for (int j = 0; j <= i; ++j)
for (int k = 1; k <= i; ++k)
add(tag1[j][k], tag1[j][k - 1]), add(tag2[k][j], tag2[k - 1][j]);
for (int j = 0; j <= i; ++j)
for (int k = 0; k <= j; ++k) {
add(f[nxt][j][k], tag1[j][k]);
add(f[nxt][j][k], tag2[j][k]);
}
}

复杂度$O(n^3)$.

2019.03.27【GDOI2019】模拟 T3的更多相关文章

  1. 2019.03.16 ZJOI2019模拟赛 解题报告

    得分: \(100+27+20=147\)(\(T1\)巨水,\(T2,T3\)只能写暴力分) \(T1\):深邃 比较套路的一眼题,显然是一个二分+贪心,感觉就是\(NOIP2018Day1T3\) ...

  2. 2019.03.19 ZJOI2019模拟赛 解题报告

    得分: \(100+10+45=155\)(\(T1\)又是水题,\(T2\)写暴力,\(T3\)大力\(STL\)乱搞) \(T1\):哈夫曼树 首先,根据题目中给出的式子,可以发现,我们要求的其实 ...

  3. 2019.03.02 ZJOI2019模拟赛 解题报告

    得分: \(10+0+40=50\)(\(T1\),\(T3\)只能写大暴力,\(T2\)压根不会) \(T1\):道路建造 应该是一道比较经典的容斥题,可惜比赛时没有看出来. 由于要求最后删一条边或 ...

  4. 2019.03.09 ZJOI2019模拟赛 解题报告

    得分: \(20+0+40=60\)(\(T1\)大暴力,\(T2\)分类讨论写挂,\(T3\)分类讨论\(40\)分) \(T1\):天空碎片 一道神仙数学题,貌似需要两次使用中国剩余定理. 反正不 ...

  5. 2019.03.13 ZJOI2019模拟赛 解题报告

    得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...

  6. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  7. 2019.03.15 ZJOI2019模拟赛 解题报告

    得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...

  8. 2019.9.27 csp-s模拟测试53 反思总结

    这个起名方式居然还有后续?! 为什么起名不是连续的?! T1想了半天,搞出来了,结果数组开小[其实是没注意范围].T2概率期望直接跳,后来翻回来写发现自己整个理解错了期望的含义[何].T3错误想到赛道 ...

  9. 2019.7.27 NOIP模拟测试9 反思总结

    先来整理题目 T1题目大意:给出n个数字和一个质数作为模数,一个变量x初始值为1.进行m次操作,每次让x随机乘上n个数中的一个,问m次操作以后x的期望值. 答案一定可以用分数表示,输出分子乘分母逆元的 ...

随机推荐

  1. JS021. 拦截事件的显式处理与默认动作(Web API: event.preventDefault)

    Web API - event.preventDefault( ) Event 接口的  preventDefault( ) 方法,告诉 user agent :如果此事件没有被显式处理,它默认的动作 ...

  2. vue 动态ip配置,避免重复打包

    目前比较流行的打包大都是在vue.config.js配置代理,然后在根目录新建.env.xxx文件配置正式环境,测试环境,开发环境等用于打包时配置不同的访问地址,作为一名随波逐流的前端开发,我也是这么 ...

  3. Vue设置全局js/css样式

    ''' 配置全局js mian.js: import settings from '@/assets/js/settings' Vue.prototype.$settings = settings; ...

  4. ansible 批量安装yum包

    1.首先安装一下ansible yum install ansible 2.修改一下ansible的参数以防ssh过去的时候需要首次判断yes  或者no sed -i 's/#host_key_ch ...

  5. Django学习day07随堂笔记

    今日考题 """ 今日考题 1.必知必会N条都有哪些,每个都是干啥使的 2.简述神奇的双下划线查询都有哪些方法,作用是什么 3.针对多对多外键字段的增删改查方法有哪些,各 ...

  6. 用Python实现童年的21款小游戏,有你玩过的吗?(不要错过哦)

    Python为什么能这么火热,Python相对于其他语言来说比较简单,即使是零基础的普通人也能很快的掌握,在其他方面比如,处于灰色界的爬虫,要VIP的视频,小说,歌,没有爬虫解决不了的:数据挖掘及分析 ...

  7. xml字符串转成数组(php)

    1 $str = '<xml> 2 <ToUserName> <![CDATA[gh_fc0a06a20993]]> </ToUserName> 3 & ...

  8. 最推荐的抓包工具charles

    Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器,当浏览器连接Charles的代理访问互联网时,Charles可以监控浏览器发送和接收的所有数据.它允许一个开发者查看所有连接互联 ...

  9. PHP验证

    class yanzhenglei{ /**     * 检查日期格式         * @param string $str 日期格式2015-01-01     * @return bool   ...

  10. postman 插件安装

    本文只是基于 Chrome 浏览器的扩展插件来进行的安装,并非单独应用程序. 首先,你要台电脑,其次,安装有 Chrome 浏览器,那你接着往下看吧. 1. 官网安装(别看) 打开官网,https:/ ...