HDU2227 Find the nondecreasing subsequences(树状数组+DP+离散化)

来源:互联网 发布:江南大学网络教育好吗? 编辑:程序博客网 时间:2024/05/18 15:05

题意:给一串数字,求不下降子序列的个数。


思路:数据量大,简单dp O(n^2)会爆,想到用树状数组存储前面的结果。数据量不大,但数据范围大,先离散化处理。复杂度O(n*logn)。


//#include<bits/stdc++.h>#include<cstdio>#include<cmath>#include<set>#include<map>#include<queue>#include<stack>#include<vector>#include<string>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<functional>#define inf 0x3f3f3f3f#define isLeapYear(x) x%100!=0 && x%4==0 || x%400==0 ? 1 : 0#define yearLen 5005using namespace std;typedef unsigned long long llu;typedef long long ll;const double PI=acos(-1.0);const double eps=1e-10;#define N 100000#define mod 1000000007#define CLR(x) memset(x,0,sizeof x)#define Lowbit(x) (x&(-x))#define Find(x,y) (Sum(x,y)-Sum(x-1,y)-Sum(x,y-1)+Sum(x-1,y-1))int bit[N+5],n,c[N+5],dp[N+5];/*计算前i项和*/int sum(int i){    int s=0;    while(i>0){        s+=bit[i];        s%=mod;        i-=Lowbit(i);    }    return s;}/*使第i项增加x*/void add(int i,int x){    /*N是i可能的最大值*/    while(i<=N){        bit[i]+=x;        bit[i]%=mod;        i+=Lowbit(i);    }}int main(){    while(~scanf("%d",&n)){        CLR(bit);        pair<int,int>p[N+5];        for(int i=1;i<=n;i++){            scanf("%d",&p[i].first);            p[i].second=i;        }        //离散化        sort(p+1,p+n+1);        for(int i=1;i<=n;i++){            c[p[i].second]=i;        }        for(int i=1;i<=n;i++){            dp[i]=sum(c[i]);            add(c[i],dp[i]+1);        }        printf("%d\n",sum(N));    }    return 0;}


0 0
原创粉丝点击