【2020.12.01提高组模拟】卡特兰数(catalan)
题目
题目描述
今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数。
卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数。
小\(A\)觉得这样的情况太平凡了。于是,他给出了\(m\)组限制,每个限制形如\((f_i,g_i)\),表示\(f_i\)不能在\(g_i\)之后出栈。
他想求出:在满足了这\(m\)组限制的前提下,共有多少个合法的出栈序列。他不喜欢大数,你只需要求出答案在模\(998244353\)意义下的值即可。
输入格式
输入第一行为两个非负整数,\(n\)、\(m\),含义题面已给出。
接下来\(m\)行,每行两个正整数,\((f,g)\) 表示一组限制。
输出格式
输出一行,为一个非负整数,表示你求得的答案 \(mod\space 998244353\)。
样例输入
3 1
2 3
样例输出
3
样例解释
可以验证\(\{1,2,3\}\),\(\{2,1,3\}\),\(\{2,3,1\}\)都是合乎条件的。
数据规模
| \(编号\) | \(分值\) | \(n\) | \(m\) | \(特殊性质\) |
|---|---|---|---|---|
| \(1\) | \(15\) | \(\le 300\) | \(= 0\) | |
| \(2\) | \(15\) | \(\le 7\) | \(\le 10\) | |
| \(3\) | \(15\) | \(\le 100\) | \(\le 50\) | |
| \(4\) | \(15\) | \(\le 300\) | \(保证所有的f_i相同\) | |
| \(5\) | \(20\) | \(\le 300\) | \(\le 300\) | |
| \(6\) | \(20\) | \(\le 300\) |
对于全部的数据,保证\(n\le 300\),\(m\le \frac{n(n-1)}{2}\),\(f_i、g_i \le n\)。
题解
题目大意:\(n\)个数以此入栈,问在满足\(m\)个形如\(f_i\)不能在\(g_i\)后出栈的限制的出栈序列数
45%
我们知道卡特兰数有个推导公式是\(f_i=\sum_{i=1}^nf_i\times f_{n-i-1}\),这个公式实际上是枚举了最后出栈的数
那么扩展到这题,我们将\(dp\)转换为区间\(dp\),枚举\(k\)为最后出栈的数,那么有两种情况不合法:\(f=k\)或者\(f>k>g\)。当\(f=k\)的时候,\(f\)是最后出栈的,显然不合法。而我们知道,小于\(k\)总是比大于\(k\)的先出栈,所以当\(f>k>g\)时也是不合法的
设\(f[i][j]\)表示\(i\)到\(j\)这个区间的合法出栈序列,那么在上述两种不合法的情况不成立的情况下,\(f[i][j]+=f[i][k-1]\times f[k+1][j]\)
时间复杂度\(O(n^3m)\),预计得分\(45\)
100%
考虑优化\(dp\),在\(O(1)\)的时间内判断合不合法。不合法条件\(f>k>g\)成立,说明\(f>g\),那么在读入时\(f>g\)的放入平面直角坐标系中,坐标\((f,g)\),那么可以前缀和优化
记录前缀和\(sm[i][j]\)和\(l[i][j]\),分别记录\(f>g\)以及所有的点,用来判断\(f>k>g\)和\(f=k\)的情况
构造一个矩形

其中\(i,j,k\)分别是区间起点,终点,以及最后出栈的数
\(f=k\)说明\(l[k][j]-l[k][i-1]>0\),而如果矩形\(sm(i,i,j,k-1)-sm(i,i,k,j)>0\),说明有\(f>k>g\)的情况,这两种情况都是不合法的
这样的话时间复杂度优化到了\(O(n^3)\),预计得分\(100\)
Code
#include<cstdio>
#define mod 998244353
#define N 310
#define ll long long
using namespace std;
ll n,m,f[N][N],sm[N][N],al[N][N];
ll get(ll x,ll y,ll p,ll q) {return sm[x][y]-sm[x][q-1]-sm[p-1][y]+sm[p-1][q-1];}
int main()
{
freopen("catalan.in","r",stdin);
freopen("catalan.out","w",stdout);
scanf("%lld%lld",&n,&m);
for (ll i=1,x,y;i<=m;++i)
{
scanf("%lld%lld",&x,&y);
if (x!=y)
{
if (x>y) ++sm[x][y];
++al[x][y];
}
}
for (ll i=1;i<=n;++i)
for (ll j=1;j<=n;++j)
{
sm[i][j]=sm[i][j]+sm[i-1][j]+sm[i][j-1]-sm[i-1][j-1];
al[i][j]=al[i][j]+al[i][j-1];
}
for (ll i=1;i<=n;++i)
f[i][i]=f[i+1][i]=f[i][i-1]=1;
for (ll len=2;len<=n;++len)
for (ll i=1;i+len-1<=n;++i)
{
ll j=i+len-1;
for (ll k=i;k<=j;++k)
{
ll x;
if (k>i) x=get(j,k-1,i,i)-get(k,j,i,i);
else x=0;
ll y=al[k][j]-al[k][i-1];
if (x<=0&&y<=0) f[i][j]=(f[i][j]+f[i][k-1]*f[k+1][j]%mod)%mod;
}
}
printf("%lld\n",f[1][n]);
fclose(stdin);
fclose(stdout);
return 0;
}
【2020.12.01提高组模拟】卡特兰数(catalan)的更多相关文章
- 【2020.12.01提高组模拟】A组反思
105,rk45 T1 赛时一开始先打了\(m=0\)的情况,也就是普通的卡特兰数,然后打了暴力,样例过了,把样例改改就不行了,原因没有保证是枚举的是合法的出栈序列 得分:\(WA\&TLE1 ...
- 【2020.12.02提高组模拟】球员(player)
题目 题目描述 老师们已经知道学生喜欢睡觉,Soaring是这项记录保持者.他只会在吃饭或玩FIFA20时才会醒来.因此,他经常做关于足球的梦,在他最近的一次梦中,他发现自己成了皇家马德里足球俱乐部的 ...
- 【2020.12.03提高组模拟】A组反思
估计:40+10+0+0=50 实际:40+10+0+0=50 rank40 T1 赛时看到\(n,m\leq9\),我当机立断决定打表,暴力打了几个点之后发现在\(n\ne m\)且\(k\ne0\ ...
- 【2020.12.02提高组模拟】A组反思
55,rk47 T1 赛时先想了\(trie\),想到不一定是前缀,然后就放弃转为打暴力 得分:\(RE22\) 正解是只用判断\(i\)与\(i+1\)的关系,那么只有两种情况,判断一下然后\(dp ...
- 【2020.11.28提高组模拟】T1染色(color)
[2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...
- 【2020.11.28提高组模拟】T2 序列(array)
序列(array) 题目描述 给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...
- 【2020.11.30提高组模拟】剪辣椒(chilli)
剪辣椒(chilli) 题目描述 在花园里劳累了一上午之后,你决定用自己种的干辣椒奖励自己. 你有n个辣椒,这些辣椒用n-1条绳子连接在一起,任意两个辣椒通过用若干个绳子相连,即形成一棵树. 你决定分 ...
- 【2020.11.30提高组模拟】删边(delete)
删边(delete) 题目 题目描述 给你一棵n个结点的树,每个结点有一个权值,删除一条边的费用为该边连接的两个子树中结点权值最大值之和.现要删除树中的所有边,删除边的顺序可以任意设定,请计算出所有方 ...
- JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift
5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
随机推荐
- HashMap的初始化,到底都做了什么?
HashMap的初始化,到底都做了什么? HashMap初始化参数都是什么?默认是多少? 为什么建议初始化设置容量? tableSizeFor方法是做什么的? 如何获取到一个key的hash值?及计算 ...
- 构建者模式(Builder pattern)
构建者模式应用场景: 主要用来构建一些复杂对象,这里的复杂对象比如说:在建造大楼时,需要先打牢地基,搭建框架,然后自下向上地一层一层盖起来.通常,在建造这种复杂结构的物体时,很难一气呵成.我们需要首先 ...
- dhcp、tftp、httpd、pxe安装CentOS6.9
虚拟机网络设置 要xshell连接虚拟机注意设置VMware Network Adapter VMnet2在同一网段 1.利用光盘配置本地yum源 [root@ZYB ~]# mount -r /de ...
- 【Kata Daily 190929】Password Hashes(密码哈希)
题目: When you sign up for an account somewhere, some websites do not actually store your password in ...
- 正式班D25
2020.11.09星期一 正式班D25 目录 13.7 LVM 13.7.1 lvm简介 13.7.2 lvm基本使用 13.7.3 在线动态扩容 13.7.4 在线动态缩容与删除 13.7.5 快 ...
- 如何将别人Google云端硬盘中的数据进行保存
查了好久终于知道! 如何将别人Google云端硬盘中的数据进行copy,而不是右键发现只有添加快捷方式 只要shift+z就可以保存了! 之后等我弄清楚怎么将别人家的云盘中的数据集导到colab再来详 ...
- 转载:Pycharm的常用快捷键
一直想着找一下pycharm的快捷键,但是每次都忘记找了,这次刚好碰到一个很全的,就直接借用别人的来当作自己的笔记ba 转载来源:https://www.cnblogs.com/liangmingsh ...
- CSS三大特性及权重叠加
层叠性: 1.样式冲突,遵循的原则是就近原则,哪个样式离结构近,就执行哪个样式 2.样式不冲突,不会层叠 继承性: 子标签会继承父标签的某些样式,如文本颜色和字号 优先级: 当同一个元素指定多个选择器 ...
- C\C++语言重点——指针篇 | 为什么指针被誉为 C 语言灵魂?(一文让你完全搞懂指针)
本篇文章来自小北学长的公众号,仅做学习使用,部分内容做了适当理解性修改和添加了博主的个人经历. 注:这篇文章好好看完一定会让你掌握好指针的本质! 看到标题有没有想到什么? 是的,这一篇的文章主题是「指 ...
- maven pom.xml 报错
首先介绍背景,在eclipse中导入一个maven的项目,在我之前的电脑上导入好用,在自己的电脑上导入居然pom报错了Missing artifact junit:junit:jar:4.11,还会有 ...