#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string.h>
#include<stdio.h>
#define se set<node>::iterator
#define lowbit(x) x&-x
#define ls l[u]
#define rs r[u]
#define PII pair<int, int>
#define rd(x) scanf("%lld",&x)
const int INF = 0x7f7f7f7f;
#define wt(x) printf("%lld ",x)
using namespace std;
//typedef long long LL;
#define int long long
const int N = 1e5+5;
int n,k;
int a[N],rt[20];
int cnt=0;
struct Seg{
int l[N*50],r[N*50],sum[N*50];
void pushup(int u)
{
sum[u] = sum[ls]+sum[rs];
}
void build(int &u,int ql,int qr)
{
u = ++cnt;
if(ql==qr) return ;
int mid = (ql+qr)>>1;
build(l[u],ql,mid);
build(r[u],mid+1,qr);
}
void modify(int u,int ql,int qr,int x,int d)
{
if(ql==qr)
{
sum[u]+=d;
return ;
}
int mid = (ql+qr)>>1;
if(x<=mid) modify(ls,ql,mid,x,d);
else modify(rs,mid+1,qr,x,d);
pushup(u);
}
int query(int u,int L,int R,int ql,int qr)
{
if(ql<=L && R<=qr)
{
return sum[u];
}
int mid = (L+R)>>1;
int ans = 0;
if(ql<=mid) ans = query(ls,L,mid,ql,qr);
if(qr>mid) ans += query(rs,mid+1,R,ql,qr);
return ans;
}
}seg;
void sol(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=k+1;i++) seg.build(rt[i],1,n);
for(int i=1;i<=n;i++)
{
for(int j=k+1;j>=1;j--)
{
int tmp;
if(j==1) tmp=1;
else tmp = seg.query(rt[j-1],1,n,1,a[i]);
seg.modify(rt[j],1,n,a[i],tmp);
}
}
// cout<<"???"<<endl;
cout<<seg.sum[rt[k+1]]<<endl;
return;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
sol();
return 0;
}
CF597C Subsequences
最新推荐文章于 2024-07-03 20:18:43 发布