【题解】逆序排列 [51nod1020]

传送门:逆序排列 \([51nod1020]\)

【题目描述】

共 \(T\) 组测试点,每一组给出 \(2\) 个整数 \(n\) 和 \(k\),在 \([1,n]\) 共 \(n\) 个数字的全排列中,逆序数为 \(k\) 的排列种数,答案对 \(1e9+7\) 取模。

【样例】

样例输入:
1
4 3 样例输出:
6

【数据范围】

\(100\%\) \(1 \leqslant T \leqslant 10000,\) \(1 \leqslant N \leqslant 1000,\) \(1 \leqslant K \leqslant 20000\)

【分析】

用 \(dp[i][j]\) 表示 \([1,i]\) 的排列中逆序对数为 \(j\) 的排列种数,为方便枚举,用 \(ss[i]\) 表示长度为 \(i\) 的排列总数\((ss[i]=min\{K,\frac{i*(i-1)}{2}\}\)。

对于数字 \(i\) 来说,在一个 \([1,i-1]\) 的排列中它有 \(i\) 个位置可以加入,加下 \(i\) 之后新构成的逆序对数 \(k\in [0,i-1]\) 。

那么 \(dp\) 方程就出来了:\(dp[i][j]+=dp[i-1][j-k]\),其中 \(0 \leqslant j \leqslant ss[i],\) \(0 \leqslant j-k \leqslant ss[i-1]\) ,所以 \(max\{0,j-ss[i-1]\} \leqslant k \leqslant min\{j,i-1\}\) 。

即 \(dp[i][j]=\sum_{k=max\{0,j-ss[i-1]\}}^{min\{j,i-1\}}dp[i-1][j-k]\) 。

时间复杂度过高,要用前缀和优化一下,\(dp[i][j]=S[j-max(0,j-ss[i-1])]-S[j-min(i-1,j)-1]\),其中 \(S[i]=\sum_{j=0}^{i}dp[i-1][j]\) 。

但是前缀和下边界可能会取到 \(0\),减了 \(1\) 之后就成了 \(-1\),\(S[-1]\)是不存在的,所以每一次写 \(S[x]\) 都要改成 \(S[x+1]\)

还要先预处理答案,询问时直接 \(O(1)\) 查询。

时间复杂度为 \(O(NK)\) 。

【Code】

#include<algorithm>
#include<cstring>
#include<cstdio>
#define LL long long
#define Re register int
using namespace std;
const int N=1003,M=2e4+3,P=1e9+7;
int T,n,K,S[M],ss[N],dp[N][M];
inline void in(Re &x){
int f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
int main(){
n=1000,K=20000;
for(Re i=2;i<=n;++i){
ss[i]=i*(i-1)>>1;
if(ss[i]>K){for(Re j=i;j<=n;++j)ss[j]=K;break;}
}
for(Re i=1;i<=n;++i)dp[i][0]=1;
for(Re j=0;j<=ss[2];++j)(S[j+1]=S[j-1+1]+dp[1][j])%=P;
for(Re i=2;i<=n;++i){
for(Re j=1;j<=ss[i];++j)(dp[i][j]=(S[j-max(0,j-ss[i-1])+1]-S[j-min(i-1,j)-1+1]+P)%P)%=P;
for(Re j=0;j<=ss[i+1];++j)(S[j+1]=S[j-1+1]+dp[i][j])%=P;
}
in(T);while(T--)in(n),in(K),printf("%d\n",dp[n][K]);
}

【题解】逆序排列 [51nod1020]的更多相关文章

  1. 51nod 1020 逆序排列 DP

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...

  2. SQL-27 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。 提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)

    题目描述 给出每个员工每年薪水涨幅超过5000的员工编号emp_no.薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列. 提示:在s ...

  3. SQL-15 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列

    题目描述 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列CREATE TABLE `employees` (`emp_no ...

  4. Java数组逆序排列

    //逆序排列原理 /* A: 数组逆序原理* a: 题目分析* 通过观察发现,本题目要实现原数组元素倒序存放操作.即原数组存储元素为{12,69,852,25,89,588},逆序后为原数组存储元素变 ...

  5. 51nod 1020 逆序排列 递推DP

    1020 逆序排列  基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...

  6. C语言 · 逆序排列

    算法提高 逆序排列   时间限制:1.0s   内存限制:512.0MB      问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然 ...

  7. 算法笔记_158:算法提高 逆序排列(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存 ...

  8. 51nod 1020 逆序排列——dp

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...

  9. 1020 逆序排列(DP)

    1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序 ...

随机推荐

  1. Linux小知识点

    磁盘 Linux的磁盘类型有IDE和SCSI两种. IDE的命名方式是采用/dev/hdx(x代表磁盘块),其下的分区则是/dev/hdxy(y代表该磁盘上的分区号) SCSI则是采用/dev/sdx ...

  2. linux环境安装配置nginx

    安装依赖 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl- ...

  3. 06、自动挂载+超级守护进程+时间同步+tcpwrapper+软硬链接+日志管理

    autofs  自动挂载服务   把下面这两条命令做成自动挂载 172.16.2.35:/share/soft /nfs/soft 172.16.2.35:/share/iso  /nfs/iso . ...

  4. 使用SpringBoot编写Restful风格接口

    一.简介    Restful是一种对url进行规范的编码风格,通常一个网址对应一个资源,访问形式类似http://xxx.com/xx/{id}/{id}. 举个栗子,当我们在某购物网站上买手机时会 ...

  5. Java的静态变量初始化的坑

    在网上看到一个很有意思的题目,题目如下 class SingleTon { private static SingleTon singleTon = new SingleTon(); public s ...

  6. 洛谷p1458顺序的分数题解

    抱歉,您们的蒟蒻yxj不知道怎么插入链接qwq就只好粘个文本的了qwq:https://www.luogu.org/problemnew/show/P1458 没错,是个黄题,因为你们的小蒟蒻只会这样 ...

  7. typora的使用技巧

    目录 Typora 的 markdown 语法 标题: 插入图片: 链接: 字体变化: 删除: 文字高亮: 角标: 文本方位: :-:| :- | -: 制作表格: 常用快捷键(补充): 下划线: T ...

  8. 关于微信订阅号里自动回复里的a链接的问题

    前阵子做了一个微信订阅号的活动,然后发现一个问题:就是回复内容里的a标签微信没有解析出来,而是这样 正常应该是这样: 具体出现这种情况的手机有: 魅族的型号是:M1 metal小米的型号是:MI 5X ...

  9. springboot2.x自定义拦截把static静态文件给拦截的坑

    新人新帖,喷后请指正,谢谢 1.王中王,坑中坑 和很多人一样,我在springboo自定义配置登录拦截的时候,写一个WebConfig类继承WebMvcConfigureAdapter,重写AddRe ...

  10. 下载mqtt.fx

    #下载mqtt.fxhttp://www.jensd.de/apps/mqttfx/1.7.1/