51nod 1376 最长递增子序列的数量 树状数组

数组A包含N个整数(可能包含相同的值)。设S为A的子序列且S中的元素是递增的,则S为A的递增子序列。如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS)。A的LIS可能有很多个。例如A为:{1 3 2 0 4},1 3 4,1 2 4均为A的LIS。给出数组A,求A的LIS有多少个。由于数量很大,输出Mod 1000000007的结果即可。相同的数字在不同的位置,算作不同的,例如 {1 1 2} 答案为2。
Input
第1行:1个数N,表示数组的长度。(1 <= N <= 50000)
第2 - N + 1行:每行1个数A[i],表示数组的元素(0 <= A[i] <= 10^9)
Output
输出最长递增子序列的数量Mod 1000000007。
Input示例
5
1
3
2
0
4
Output示例
2

解题:
直接维护到每一个位置为止的递增长度即可,重载一下加法操作。
 
#include
#include
#include
#include
#include
#include
using namespace std;
#define mod 1000000007

const int maxn =60000;
int n;
int  lowbit(int x)
{
    return x&(-x);
}

struct node
{
    int len;
    int kind;
    node(){len=0; kind=0;}
    node(int _len,int _kind){len=_len;kind=_kind;}
    node operator +(const node &tmp)const
    {
        if(lentmp.pos;
        }
        return val0)
    {
        tmp=tmp+b[x];
        x-=lowbit(x);
    }
    return tmp;
}

void update(int x,node tp)
{
    while(x<=n)
    {
        b[x]=b[x]+tp;
        x+=lowbit(x);
    }
}


int main()
{
//    freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i].val);
            a[i].pos=i;
        }
        sort(a+1,a+n+1);
        node tmp,miao;
        for(int i=1;i<=n;i++)
        {
          tmp=getsum(a[i].pos);
          if(tmp.len==0) tmp.kind=1;
          tmp.len++;
          update(a[i].pos,tmp);
          miao=miao+tmp;
        }
//        node miao;
//        for(int i=1;i<=n;i++)
//            miao=miao+b[i];
        printf("%d\n",miao.kind);
    }
    return 0;
}


你可能感兴趣的:(树状数组)