#217. 上升序列

来源:互联网 发布:php计算器代码 编辑:程序博客网 时间:2024/06/05 00:47

傻逼题233。思路简单,代码好写。

先考虑50分算法。用i表示用了前i个数,j表示最大数为j,k表示序列长度,则f[i][j][k]=∑f[i-1][j1][k-1],j1<j。

然后用树状数组优化好像就A了。

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cstdlib>using namespace std;#define rep(i,j,k) for(i=j;i<=k;++i)#define per(i,j,k) for(i=j;i>=k;--i)#define ull unsigned long long#define db double#define mkp(x,y) make_pair(x,y)#define pii pair<int,int>#define X first#define Y secondconst int N=100005;ull c[12][N];int n,k,a[N];ull query(ull cc[],int x){int y;ull z=0;for(y=x;y;y-=y&-y)z+=cc[y];return z;}void add(ull cc[],int x,ull y){for(;x<=n;x+=x&-x)cc[x]+=y;}int main(){int i,j;scanf("%d%d",&n,&k);++k;rep(i,1,n)scanf("%d",&a[i]);rep(i,1,n){per(j,k,2)add(c[j],a[i],query(c[j-1],a[i]-1));add(c[1],a[i],1);}printf("%llu\n",query(c[k],n));return 0;}