[BZOJ] 2431 逆序对数列
Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 2611 Solved: 1526
[Submit][Status][Discuss]
Description
对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数。若对于任意一个由1~n自然数组成的
数列,可以很容易求出有多少个逆序对数。那么逆序对数为k的这样自然数数列到底有多少个?
Input
第一行为两个整数n,k。
Output
写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对10000求余数后的结果。
Sample Input
4 1
Sample Output
3
样例说明:
下列3个数列逆序对数都为1;分别是1 2 4 3 ;1 3 2 4 ;2 1 3 4;
100%的数据 n<=1000,k<=1000
HINT
Source
Day1
先想到区间dp,发现只记录前缀就行,所以二维就可以解决。
f[i][j],前i个数,j个逆序对的方案数。
对于新加入的i+1,可以造成i+1种逆序对,所以枚举前面的就行了。
先写的暴力版本,TLE两个点,一算10000*1000没爆int,把mod放外面,快了不少,过了一个点,然后循环展开,不开o2也跑得飞快(相较朴素暴力…)
#include<iostream>
#include<cstdio>
using namespace std;
int n,k;
int f[1005][1005]={1};
int main(){
scanf("%d%d",&n,&k);
for(register int i=1;i<=n;i++){
for(register int j=0;j<=k;j++){
int l=0;
for(l=0;l<i-8;l+=8){
if(j<l) continue;
f[i][j]+=f[i-1][j-l];
if(j<l+1) continue;
f[i][j]+=f[i-1][j-l-1];
if(j<l+2) continue;
f[i][j]+=f[i-1][j-l-2];
if(j<l+3) continue;
f[i][j]+=f[i-1][j-l-3];
if(j<l+4) continue;
f[i][j]+=f[i-1][j-l-4];
if(j<l+5) continue;
f[i][j]+=f[i-1][j-l-5];
if(j<l+6) continue;
f[i][j]+=f[i-1][j-l-6];
if(j<l+7) continue;
f[i][j]+=f[i-1][j-l-7];
}
for(l;l<i;l++){
if(j<l) continue;
f[i][j]+=f[i-1][j-l];
}
f[i][j]%=10000;
}
}
printf("%d",f[n][k]);
return 0;
}
正解是前缀和优化,每次更新都是加一段连续区间的值,可以用前缀和降复杂度。
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=1005;
const int MOD=10000;
int dp[MAXN][MAXN];
int n,k,ans,sum;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) dp[i][0]=1;
for(int i=2;i<=n;i++)
{
sum=0;
for(int j=0;j<=k;j++)
{
(sum+=dp[i-1][j])%MOD;
dp[i][j]=sum%MOD;
if(j-i+1>=0)((sum-=dp[i-1][j-i+1])+=MOD)%MOD;
}
}
printf("%d\n",dp[n][k]);
return 0;
}
[BZOJ] 2431 逆序对数列的更多相关文章
- BZOJ 2431 逆序对数列 DP
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列{ai},如果有i< j且ai> ...
- BZOJ 2431: [HAOI2009]逆序对数列( dp )
dp(i,j)表示1~i的全部排列中逆序对数为j的个数. 从1~i-1的全部排列中加入i, 那么可以产生的逆序对数为0~i-1, 所以 dp(i,j) = Σ dp(i-1,k) (j-i+1 ≤ k ...
- 2431: [HAOI2009]逆序对数列
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 954 Solved: 548[Submit][Status ...
- bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
http://www.lydsy.com/JudgeOnline/problem.php?id=2431 dp[i][j] 表示i的排列,有j个逆序对的方案数 加入i+1,此时i+1是排列中最大的数, ...
- bzoj2431:[HAOI2009]逆序对数列
单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...
- bzoj2431: [HAOI2009]逆序对数列(前缀和优化dp)
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 2312 Solved: 1330[Submit][Stat ...
- 【BZOJ2431】逆序对数列(动态规划)
[BZOJ2431]逆序对数列(动态规划) 题面 Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组 ...
- P2513 [HAOI2009]逆序对数列
P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那 ...
- BZOJ2431 HAOI2009 逆序对数列 【DP】*
BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai,如果有i<j且ai>aja_i>a_jai>aj,那么我们称aia ...
随机推荐
- Bootstrap标签页
用法 您可以通过以下两种方式启用标签页: 通过 data 属性:您需要添加 data-toggle="tab" 或 data-toggle="pill" 到锚文 ...
- express中cookie的使用和cookie-parser的解读
https://segmentfault.com/a/1190000004139342?_ea=504710 最近在研究express,学着使用cookie,开始不会用,就百度了一下,没有百度到特别完 ...
- poj1419 求最大独立集
题目链接:http://poj.org/problem?id=1419 题意:求最大独立集 思路: 这里有一个定理: 最大独立集=补图的最大团最大团=补图的最大独立集 所以这里我们只要求给出的图的最大 ...
- appcompat_v7 引起的新建Android工程编译不过的问题 (转载)
转自:http://blog.csdn.net/zhao7134/article/details/34449641 eclipse adt 上新建基于Android4.4(kk)的Android项目时 ...
- bzoj 1640||1692: [Usaco2007 Dec]队列变换【后缀数组】
注意输出是80字符个一行!! 首先贪心很显然,就是两头尽量拿小的. 然后需要处理两头一样的情况,显然是选字典序小的一串,把数组反着接在原数组后面,然后跑sa,判断的时候直接比较rk数组 #includ ...
- 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】
和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...
- mariadb+centos7+主从复制
MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的 ...
- Windows下安装Ubuntu16.04双系统
ROS需要在Ubuntu系统上开发,虚拟机跑Ubuntu开发ROS容易出现各种各样的问题,所以需要安装Ubuntu16.04双系统.笔者也是一步步按着网上的帖子来,由于网上的教程都不是最新的而且有的也 ...
- 题解报告:hdu1995汉诺塔V(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 Problem Description 用1,2,...,n表示n个盘子,称为1号盘,2号盘,. ...
- 等待进程结束函数中的BUG
偶然发现一个BUG,有一个函数是这样写的: void WaitProcExit(DWORD dwPid) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACC ...