$AcWing$

$Description$

$Sol$

首先显然是是以严格递增子序列的长度为阶段,由于要单调递增,所以还要记录最后一位的数值
$F[i][j]$表示前$i$个数中以$A_i$结尾的长度为j单调递增序列有多少个
$F[i][j]=\sum_{k<i且A_k<A_i}^{ }F[k][j-1]$
注意到,如果没有$A_k<A_i$这个条件我们就可以直接维护前缀和了
有$A_k<A_i$这个条件,可以考虑维护$A_i$为下标,$F[i][j-1]$为值的数组的前缀和
$A_i$的值会过大而不能作为下标,要离散化
但是$i$每增加$1$,这个数组并不像之前那样简单的在数组后面加一个值,而是在不确定的地方修改,这样的话如果再是朴素地维护前缀和也起不到上面优化的作用了
待修改的区间求和问题$???$树状数组$!!!$
也就是说维护一个以$A_i$的离散值为下标,$F[i][j-1]$为值的树状数组就好啦
然后讲下细节(敖丙说了细节决定成败$qwq$).就是初始化是$f[0][0]=1$,但是众所周知树状数组的下标不可以为$0$,所以把整个树状数组往右移一位.
 

$Code$

 #include<bits/stdc++.h>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof(a));
#define int long long
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=,mod=(1e9)+;
int T,n,n1,m,as,a[N],b[N],v[N],c[N],f[N][N];
il int Find(int x){return find(b+,b+n1+,x)-b;}//find(b+1,b+n1+1,x)-b;}
il int lowbit(int x){return x&(-x);}
il void add(int p,int w){while(p<=n1){c[p]=(c[p]+w)%mod;p+=lowbit(p);}}
il int sum(int p){int ret=;while(p){ret=(ret+c[p])%mod;p-=lowbit(p);}return ret%mod;}
main()
{
T=read();
go(TT,,T)//remember to init
{
n=read(),m=read();
go(i,,n)a[i]=b[i]=read();
sort(b+,b+n+);
n1=unique(b+,b+n+)-(b+);
go(i,,n){v[i]=Find(a[i]);}
f[][]=;
go(i,,m)
{
mem(c,);if(i==)add(,);
go(j,,n)f[i][j]=sum(v[j]),add(v[j]+,f[i-][j]);
}
as=;go(i,,n)as=(as+f[m][i])%mod;
printf("Case #%lld: %lld\n",TT,as);
}
return ;
}

随机推荐

  1. PyTorch代码调试利器: 自动print每行代码的Tensor信息

    本文介绍一个用于 PyTorch 代码的实用工具 TorchSnooper.作者是TorchSnooper的作者,也是PyTorch开发者之一. GitHub 项目地址: https://github ...

  2. oracle函数 trunc(x[,y])

    [功能]返回x按精度y截取后的值 [参数]x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则截取到y位小数,如果y小于0则截取到小数点向左第y位,小数前其它数据用0表示. [返回 ...

  3. supersocket新的配置属性 "textEncoding"

    在 SuperSocket 1.6 之前的版本, 当你通过Session对象发送文本时, 将文本信息转换成能够通过Socket传输的二进制数据的默认编码是UTF8. 你可以通过设置 Session 的 ...

  4. U盘还原系统

    相信现在不少的人已经开始使用U盘作为启动盘来安装系统,说起来这可比用光盘装系统可是方便多了.毕竟U盘可以随身携带,至于光盘嘛,就不多说了.       可是还有许多人对U盘安装系统还是有些陌生的感觉. ...

  5. Java 简单校验框架

    数据校验框架现状 在我们的方法入口后面,难免会有如下样子的代码: result.setSuccess(false); if (StringUtils.isBlank(bizOrder.getThird ...

  6. SuperSocket 中的日志系统

    当 SuperSocket boostrap 启动时,日志系统将会自动启动. 所以你无须创建自己的日志工具,最好直接使用SuperSocket内置的日志功能. SuperSocket 默认使用log4 ...

  7. 用CSS画平行四边形

    <div class="jx">我是一个平行四边形</div> <style> .jx{ //定义div的高度宽度 transform:skew ...

  8. [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]

    由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...

  9. Python--day72--SweetAlert插件

    引用:http://www.cnblogs.com/liwenzhou/p/8718861.html 补充一个SweetAlert插件示例 点击下载Bootstrap-sweetalert项目. $( ...

  10. java基本数据类型转换之向上转型和向下转换

    向上转换: 整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则: 容量小的类型可自动转换为容量大的数据类型: byte,short,char → int → long → float ...