题目和南阳那道题一样链接http://www.cnblogs.com/zzuli2sjy/p/4943774.html
代码:
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<iostream> 6 #include<map> 7 typedef long long ll; 8 const ll N=1e5+5; 9 ll dp[20][N]; 10 ll a[N]; 11 ll bit[N]; 12 int found(int n,int m,ll k); 13 ll sum(int i); 14 void add(int i,ll x,int t); 15 using namespace std; 16 int main(void) 17 { 18 ll i,j,k,p,q; 19 while(scanf("%I64d %I64d",&k,&p)!=EOF) 20 { 21 memset(dp,0,sizeof(dp)); 22 memset(bit,0,sizeof(bit)); 23 for(i=0; i<k; i++) 24 { 25 scanf("%I64d",&a[i]); 26 }int cnt=k; 27 for(i=0; i<k; i++) 28 { 29 dp[1][i]=1; 30 } 31 for(i=2; i<=p+1; i++) 32 { 33 memset(bit,0,sizeof(bit)); 34 for(j=i-2; j<k; j++) 35 { 36 dp[i][j]=sum(a[j]-1); 37 add(a[j],dp[i-1][j],cnt); 38 } 39 40 } 41 ll sum=0; 42 for(i=0; i<k; i++) 43 { 44 sum+=dp[p+1][i]; 45 46 } 47 printf("%I64d ",sum); 48 } 49 return 0; 50 } 51 ll sum(int i) 52 { 53 ll s=0; 54 while(i>0) 55 { 56 s+=bit[i]; 57 i-=(i&-i); 58 } 59 return s; 60 } 61 62 void add(int i,ll x,int t) 63 { 64 while(i<=t) 65 { 66 bit[i]+=x; 67 i+=(i&-i); 68 } 69 }