wmq的队伍

发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 2000ms   内存限制: 512M

描述

交大上课需要打卡,于是在上课前的几分钟打卡机前往往会排起长队。

平时早睡早起早早打卡的wmq昨晚失眠,今天起晚了,于是他也加入了打卡队伍中。

这个时候,wmq发现了神奇的现象,打卡队伍可以按人们的身高看成一个队列,左边是队头,右边是队尾。

对于队列a1...an,wmq想知道其中存在多少的有序k元组l1...lk

使得1≤l1<l2<...<lk≤n,并且有al1>al2>...>alk

输入

输入有多组数据

第一行是一个正整数T,1≤T≤15,代表数据组数

每组数据第一行是两个正整数n,k,1≤n≤2∗104,1≤k≤min(n,100)

n​代表队列的人数,k​ 的含义见题面

接下来一行有n个正整数,代表1到n的一个排列,表示队伍的身高情况

输出

对于每组数据,输出一个整数,代表有序k元组的个数

考虑到数字可能很大,将答案对109+7取模之后输出

样例输入1 复制

3
2 2
1 2
2 2
2 1
22 3
1 2 3 4 5 16 6 7 8 9 10 19 11 12 14 15 17 18 21 22 20 13

样例输出1

0
1
8

很容易想到用动态规划的方式来解决在这道题目,我们用dp[i][j][t]来表示在前i个队伍里,以t结尾的j元祖有多少个

这样的话转移就是dp[i][j][t] = sum(dp[i-1][j-1][m])其中m > t

但这样的话空间复杂度是4*10^10,我们发现dp[i]只与dp[i-1]有关,因此可以重复利用,所以 省掉一维只用dp[j][t]来表示就好了,这样的话复杂度降低到了2*10^6可以忍受了。

另外时间复杂度,因为i要从1循环到2*10^4 ,元组长度 要循环100次,比t大的m的循环最差也要循环2*10^4,因此总的时间复杂度为4*10^10显然不能通过。

我们要利用这道题目很重要的一点,队列中的人是1到n的一个排列,因此n最大不超过2*10^4,我们可以想到用树状数组的方法来求出sum(dp[i-1][j-1][m])的值,只需要logn的复杂度就行了,注意要为每个j元组都要开一个树状数组

int bitree[maxk][maxn];//为j元组开辟树状数组

这样的话sum(dp[i-1][j-1][m]) 的值实际上就等于sum(j-1,n) - sum(j-1,t);t是队伍中的第i个元素

注意爆int!别忘记取mod,比赛时候因为这两个低级错误WA了6发。。。。。55555

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define int long long
const int maxk = 105;
const int maxn = 20005;
int bitree[maxk][maxn];
int dp[maxk][maxn];//dp[i][j]表示 i元组,末尾为j的元组个数
const int MOD = 1e9 + 7;
int n,k;
inline int lowbit(int x){return x&(-x);
}
void add(int tid,int pos,int val){while(pos <= n){bitree[tid][pos] += val;pos += lowbit(pos);}
}
int sum(int tid,int pos){int res = 0;while(pos > 0){res += bitree[tid][pos];pos -= lowbit(pos);}return res;
}
void init(){memset(bitree,0,sizeof(bitree));memset(dp,0,sizeof(dp));
}
main(){int T;scanf("%lld",&T);while(T--){init();scanf("%lld%lld",&n,&k);int now;for(int i = 1;i <= n;i++){scanf("%lld",&now);dp[1][now] = 1;add(1,now,1);for(int j = 2;j <= k;j++){dp[j][now] = (sum(j-1,n) - sum(j-1,now))% MOD;add(j,now,dp[j][now]);}}int ans = 0;for(int i = 1;i <= n;i++){ans  = (ans + dp[k][i]) % MOD;}printf("%lld\n",ans);}return 0;
} 

dp 树状数组 逆序元组相关推荐

  1. 树形DP+树状数组 HDU 5877 Weak Pair

    1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...

  2. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

  3. 牛客 - tokitsukaze and Inverse Number(树状数组+逆序对定理)

    题目链接:点击查看 题目大意:给出一个长度为 n 的排列 a,需要执行 q 次操作,每次操作会将区间 [ l , r ] 内的数循环右移 k 次,现在需要回答每次操作后排列的逆序对数,只需要回答奇偶即 ...

  4. 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)

    题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...

  5. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

  6. 小沙的remark(朴素DP、优化DP+树状数组OR线段树)

    题目 原题链接 问题描述 给定n(1≤n≤2∗106)n(1\leq n\leq2∗10^6)n(1≤n≤2∗106)和seedseedseed,将基于seedseedseed生成两个长度为nnn的序 ...

  7. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2545  Solved: 1419 [Submit][S ...

  8. [BZOJ 2434][Noi2011]阿狸的打字机(AC自动机+树状数组+dfs序)

    Description 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: ·输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母 ...

  9. CodeForces - 987E Petr and Permutations(树状数组+逆序对定理)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,可能打乱过 3 * n 次,也可能打乱过 7 * n + 1 次,问到底打乱过多少次 题目分析:首先看出,3 * n 和 7 * n + 1 ...

最新文章

  1. struts2 开发
  2. php curl errno 3,PHP curl_errno函数
  3. python中image.open函数怎么用_详解Python中open()函数指定文件打开方式的用法
  4. SAP ABAP报表依赖设计原理详解
  5. Oracle数据库基本概念理解(3)
  6. 猎豹浏览器截图在哪 猎豹浏览器如何截图
  7. C# 动态装载 DLL
  8. jmeter 安装详解
  9. VirtualBox – Error In supR3HardenedWinReSpawn 问题解决办法
  10. webgame 上线版本控制
  11. eclipse环境下基于已构建struts2项目整合spring+hibernate
  12. oracle erase,Arc SDE forOracle实现erase空间分析计算
  13. 【FFmpeg4.1.4】音视频分离器
  14. python播放全网视频+打包成exe
  15. mysql查询表升序降序_创建一个按钮,对MYSQL查询进行升序和降序排序
  16. mysql ereg_php5.3x不再支持ereg和eregi,解决方法
  17. QT ffmpeg 播放器
  18. python 装机配置_Python如何实现自动装机功能 Python实现自动装机功能代码实例
  19. STM32 环境光传感器ADC采样
  20. man 命令指定section

热门文章

  1. 归并排序 java 迭代_经典排序算法之归并排序(示例代码)
  2. python 3.9特性_Python 3.9来了!这十个新特性值得关注
  3. 数据结构——二叉树的层次遍历
  4. [Spring5]IOC容器_Bean管理XML方式_外部属性文件
  5. Mayor's posters POJ - 2528 (离散化+线段树)
  6. elasticSearch -- (文档,类型,索引)
  7. java开发中准则怎么写_Java开发中通用的方法和准则20条
  8. target not created怎么解决_怎么才能最短时、高效、踏实地学习 Python(附链接)...
  9. 数据结构-查找-总结归纳知识点
  10. F. Ivan and Burgers(前缀线性基模板)