#前缀和优化dp#牛客练习赛71 C 数学考试
题目
求\(1\sim n\)的排列,有\(m\)个限制条件,第\(i\)个限制条件\(p_i\),
表示前\(p_i\)个数不能是\(1\sim p_i\)的排列,求符合要求的排列的个数。
分析
这里是单纯计数的做法,时间复杂度\(O(n^2)\)
设\(dp[i][j]\)表示前\(i\)个数均\(\leq j\)并且必须包含\(j\)的方案数,
初始化\(dp[1][1\sim n]=1\)(如果第一个数有限制要特判),最后输出\(dp[n][n]\)
首先可以写出一个朴素的方程,
\]
前面表示选完\(i-1\)个数已经包含\(j\),
那在\(1\sim j\)中还有\(j-i+1\)个数可以选择填入
否则以前没有选择\(j\)且全部小于\(j\),那么现在选择\(j\)就可以了。
对于一个限制直接让\(dp[i][i]=0\)就可以了
然而这是\(O(n^3)\)的做法,不过后面这一坨前缀和优化就可以做到\(O(n^2)\)
然而如果\(n\)很大,但是\(m\)还是原来的数据范围的话会直接T飞,
但是数据还是很良心的,还是wtcl
同步于牛客博客。
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int mod=20000311,N=2011;
int n,m,a[N],dp[N][N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
n=iut(),m=iut();
for (rr int i=1;i<=m;++i) a[i]=iut();
for (rr int i=1;i<=n;++i) dp[1][i]=1;
sort(a+1,a+1+m);
for (rr int i=1,I=1;i<=n;++i){
rr int sum=dp[i-1][i-1];
if (i>1) for (rr int j=i;j<=n;++j)
dp[i][j]=mo(sum,1ll*dp[i-1][j]*(j-i+1)%mod),
sum=mo(sum,dp[i-1][j]);
if (a[I]==i) dp[i][i]=0,++I;
}
return !printf("%d",dp[n][n]);
}
#前缀和优化dp#牛客练习赛71 C 数学考试的更多相关文章
- 牛客练习赛71 C.数学考试 (DP,容斥原理)
题意:RT 题解:先对\(p\)排个序,然后设\(dp[i]\)表示前\(i-1\)个\(p[i]\)满足条件但是\(p[i]\)不满足,即在\([1,p[i]]\)中不存在从\(p[1]\)到\(p ...
- 线段树优化dp——牛客多校第一场I(好题)
和两天做了两道数据结构优化dp的题,套路还是差不多的 题解链接! https://www.cnblogs.com/kls123/p/11221471.html 一些补充 其实这道题的dp[i]维护的不 ...
- 牛客练习赛71 数学考试 题解(dp)
题目链接 题目大意 要你求出有多少个长度为n的排列满足m个限制条件 第i个限制条件 p[i]表示前 p[i]个数不能是1-p[i]的排列 题目思路 这个感觉是dp但是不知道怎么dp 首先就是要明白如果 ...
- 牛客练习赛79E-小G的数学难题【dp,单调队列】
正题 题目链接:https://ac.nowcoder.com/acm/contest/11169/E 题目大意 给出\(n\)个三元组\((a_i,b_i,c_i)\). 要求选出一个集合\(S\) ...
- 牛客练习赛53 A 超越学姐爱字符串 (DP)
牛客练习赛53 超越学姐爱字符串 链接:https://ac.nowcoder.com/acm/contest/1114/A来源:牛客网 超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢" ...
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- 牛客练习赛22C Bitset
牛客练习赛22C 一共有 n个数,第 i 个数是 xi xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 感觉二进制真是一个神奇的东西. #include <iost ...
- 牛客练习赛11 假的字符串 (Trie树+拓扑找环)
牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...
- 牛客练习赛64 D【容斥+背包】
牛客练习赛64 D.宝石装箱 Description \(n\)颗宝石装进\(n\)个箱子使得每个箱子中都有一颗宝石.第\(i\)颗宝石不能装入第\(a_i\)个箱子.求合法的装箱方案对\(99824 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
随机推荐
- vue运行时报错Error from chokidar
原文博客地址 Error from chokidar (/home/youyou/文档/vue/vuetask01/node_modules/lodash): Error: ENOSPC: Syste ...
- JVM运行时参数
JVM运行时参数 JVM运行时参数是用于配置和调整Java虚拟机的行为和性能的参数.这些参数可以在启动Java应用程序时通过命令行或配置文件进行设置,合理配置参数可以使JVM虚拟机的达到更好的性能,降 ...
- 【LeetCode贪心#07】分糖果(两个维度)
发糖果 力扣题目链接(opens new window) 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖 ...
- 【Azure Redis 缓存】Azure Cache for Redis有默认备份可以用于恢复么?
问题描述 Azure Cache for Redis有默认备份可以用于恢复么? 答: 只有高级版Redis有. 问题原因 Azure Cache for Redis有不同的版本定价层(基本 Basic ...
- C++ 模板的笔记1
C++模板的笔记1 C++ 函数模板 函数模板的定义 函数模板是一种可以生成不同类型函数的函数声明.函数模板的参数类型不是固定的,而是在调用时由实参类型推导出来. 语法: template <t ...
- 《Document-level Relation Extraction as Semantic Segmentation》论文阅读笔记
原文 代码 摘要 本文研究的是文档级关系抽取,即从文档中抽取出多个实体之间的关系.现有的方法主要是基于图或基于Transformer的模型,它们只考虑实体自身的信息,而忽略了关系三元组之间的全局信息. ...
- 鸿蒙 Harmony 的跨端技术方案
这两年要说技术上最火的关键字,我想肯定离不开"鸿蒙"两个字. 不管是技术社区还是身边的开发者多多少少都在关注鸿蒙的发展趋势,特别是 HarmonyOS NEXT 版本将进入独立生态 ...
- 第142篇:原生js实现响应式原理
好家伙,狠狠地补一下代码量 本篇我们来尝试使用原生js实现vue的响应式 使用原生js,即代表没有v-bind,v-on,也没有v-model,所有语法糖我们都用原生实现 1.给输入框绑个变量 & ...
- AMD Intel CPU 对比图
- 使用Deployment和Service实现简单的灰度发布
在Kubernetes中,使用单个Service和多个Deployment来实现灰度发布的一种常见方法是利用标签(Labels)和选择器(Selectors)来控制哪些Pods接收来自Service的 ...