HDU-4991-Ordered Subsequence

来源:互联网 发布:mac版本spss 编辑:程序博客网 时间:2024/05/16 12:36

比赛的时候真应该先做这个题,唉,这个题其实不难想,用二维树状数组维护即可。不过我在unique那小卡了一下。

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=10100;const int mod=123456789;int n,m,cnt,a[maxn],b[maxn];int t[110][maxn];int lowbit(int x){    return x&(-x);}int Sum(int x,int pos){    int ans=0;    for(;x>0;x-=lowbit(x))        ans=(ans+t[pos][x])%mod;    return ans;}void Update(int x,int pos,int val){    for(;x<=cnt;x+=lowbit(x))        t[pos][x]=(t[pos][x]+val)%mod;}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(t,0,sizeof(t));        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            b[i]=a[i];        }        if(n<m)        {            printf("0\n");            continue;        }        sort(b+1,b+n+1);        cnt=unique(b+1,b+n+1)-b-1;        for(int i=1;i<=n;i++)            a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;        Update(a[1],1,1);        for(int i=2;i<=n;i++)        {            for(int j=m;j>=2;j--)            {                int sum=Sum(a[i]-1,j-1);                //printf("SSS %d %d %d %d\n",a[i],i,j,sum);                Update(a[i],j,sum);            }            Update(a[i],1,1);        }        printf("%d\n",Sum(cnt,m));    }    return 0;}


0 0