51Nod 1020 离线+DP
来源:互联网 发布:田园城市 知乎 编辑:程序博客网 时间:2024/05/22 00:38
题目链接
题意:
定义一个排列的逆序数为排列中逆序对的个数。
给出
思路:
考虑动态规划
定义
考虑对于
那么对于
可以考虑利用
初始
假设第
则:
若第
则:
……依此类推
则
其中求和式可以利用前缀和进行优化时间复杂度。
因多组数据,可以考虑离线处理,优化空间复杂度。
最后总复杂度为:
代码:
#include<cstdio>#include<algorithm>using namespace std;const int mod = 1e9 + 7;const int A = 2e4 + 10;int dp[A],sum[A],Ans[A],Mx_n,Mx_k,q;class Qu{public: int n,k,id; bool operator<(const Qu& rhs) const{ if(n != rhs.n) return n < rhs.n; return k < rhs.k; }}Q[A];void solve(int n,int k){ dp[0] = 1; int tot = 1; for(int i=2 ;i<=n ;i++){ sum[0] = dp[0]; while(tot<=q && Q[tot].n == i && Q[tot].k == 0){ Ans[Q[tot].id] = 1; tot++; } for(int j=1 ;j<=k ;j++) sum[j] = (sum[j-1] + dp[j])%mod; for(int j=1 ;j<=k ;j++){ if(j-i+1 > 0) dp[j] = (sum[j] - sum[j-i])%mod; else dp[j] = sum[j]; if(dp[j]<0) dp[j] += mod; while(tot<=q && Q[tot].n == i && Q[tot].k == j){ Ans[Q[tot].id] = dp[j]; tot++; } } } //printf("tot = %d\n",tot); for(int i=1 ;i<=q ;i++){ printf("%d\n",Ans[i]); }}int main(){ scanf("%d",&q); Mx_n = Mx_k = 0; for(int i=1 ;i<=q ;i++){ scanf("%d%d",&Q[i].n,&Q[i].k); Q[i].id = i; Mx_n = max(Mx_n,Q[i].n); Mx_k = max(Mx_k,Q[i].k); } sort(Q+1,Q+1+q); solve(Mx_n,Mx_k); return 0;}
阅读全文
0 0
- 51Nod 1020 离线+DP
- 51nod 1020 逆序排列(dp+离线)
- 51nod 1276 【离线处理】
- 51nod 1020:逆序排列 DP
- 51nod 1020 逆序排列(dp)
- 51nod 1020 逆序排列【DP】
- 51nod 1371 DP
- 51NOD 1296-dp
- 51nod (dp)
- 51nod 1050【DP】
- 51nod 1268【dp】
- 51Nod - 1043 dp
- 51Nod - 1270 dp
- 51Nod - 1406 dp
- 51Nod - 1376 dp
- 51nod 1183 (dp)
- 【dp】51nod
- 51nod 1202 dp
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- cpp全局变量和局部变量的使用
- linux开发入门之环境的搭建
- Dagger2入门!精通!最美!死神的力量!
- Centos安装Mysql
- 51Nod 1020 离线+DP
- [BZOJ3786]星系探索-ETT
- Java中的锁—类锁、对象锁
- [JavaEE]Struts2路径问题(如何在jsp页面正确访问struts.xml中的action)
- Linux下查找文件及查找包含指定内容的文件常用命令
- PyCharm安装之旅——20171207
- struts.objectFactory
- PrintWriter中write与println方法的区别
- 自动化学习记录问题1