$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. deepin 安装golang protobuf

    1.安装库文件protobuf,地址:https://github.com/protocolbuffers/protobuf/releases 我电脑是deepin 64位的,所以我直接下载https ...

  2. 洛谷P1507 NASA的食物计划

    //二维费用背包 #include<bits/stdc++.h> using namespace std; ; ; ; int v1[maxn],v2[maxn],w[maxn],n,v1 ...

  3. 模板—e-dcc缩点

    int dfn[MAXN],low[MAXN],cnt; bool isbridge[MAXN]; void tarjan(int x,int edg) { low[x]=dfn[x]=++cnt; ...

  4. 关于react-router 路径改变页面没有刷新

    routert.js 中: <Router> <Switch> <Route exact path="/" component={Login}> ...

  5. 检查进程启动情况,开始时间、启动时间、启动进程数、进程数是否正确、PID

    #!/bin/sh bin=$(cd ``;pwd) cd ${bin} ### 定义检查函数 chk(){ programName=$ correctNum=$ programSubName=$ # ...

  6. Oracle数据字典全解

    一.概念: 1.数据字典(data dictionary)是 Oracle 数据库的一个重要组成部分,这是一组用于记录数据库信息的只读(read-only)表. 数据字典里存有用户信息.用户的权限信息 ...

  7. oracle 减少对表的查询

    在含有子查询的SQL语句中,要特别注意减少对表的查询. 例如: 低效 SELECT TAB_NAME FROM TABLES WHERE TAB_NAME = ( SELECT TAB_NAME FR ...

  8. BERT大火却不懂Transformer?读这一篇就够了 原版 可视化机器学习 可视化神经网络 可视化深度学习

    https://jalammar.github.io/illustrated-transformer/ The Illustrated Transformer Discussions: Hacker ...

  9. 2018年NOIP普及组复赛题解

    题目涉及算法: 标题统计:字符串入门题: 龙虎斗:数学题: 摆渡车:动态规划: 对称二叉树:搜索. 标题统计 题目链接:https://www.luogu.org/problem/P5015 这道题目 ...

  10. 【codeforces 520A】Pangram

    [题目链接]:http://codeforces.com/problemset/problem/520/A [题意] 给你一个字符串. 统计里面有没有出现所有的英文字母->'a'..'z' 每个 ...