题意:
给定长度为n的排列,和一个整数k,
问有多少个长度为k+1的递增子序列.
数据范围:n<=1e5,k<=10,保证最后答案不超过8e18
解法:
d[i][j]表示以a[i]结尾,长度为j的子序列数量.
d[i][1]=1;
d[i][j]=sum(d[k][j-1]),其中a[k]<a[i]
对每一个j开一个BIT,快速计算a[k]<a[i]的所有d[k][j-1]
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e5+5;
int d[maxm][12];
int a[maxm];
int n,k;
struct BIT{
int c[maxm];
int lowbit(int i){
return i&-i;
}
void add(int i,int t){
while(i<maxm){
c[i]+=t,i+=lowbit(i);
}
}
int ask(int i){
int ans=0;
while(i){
ans+=c[i];
i-=lowbit(i);
}
return ans;
}
}t[12];
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
for(int i=1;i<=n;i++){
d[i][1]=1;
t[1].add(a[i],d[i][1]);
for(int j=2;j<=k+1;j++){
d[i][j]=t[j-1].ask(a[i]-1);
t[j].add(a[i],d[i][j]);
}
}
for(int i=1;i<=n;i++){
ans+=d[i][k+1];
}
cout<<ans<<endl;
return 0;
}