HDU 2227 Find the nondecreasing subsequences
2014-03-03 10:51
369 查看
题目大意:给定一个序列,求出其所有的上升子序列。
题解:一开始我以为是动态规划,后来发现离散后树状数组很好做,首先,c保存的是第i位上升子系列有几个,那么树状数组的sum就直接是现在的答案了,不过更新时不要忘记加1,因为当前元素本身也是一个子序列,比如数列离散后为1 3 2 4 5,那么第一位得到之前的答案为0,更新时1位加1,第二位算出为1,更新时3位加(1+1),第三位也一样,一次类推,同树状数组求逆序对的方法一样,但是更新的不是1,而是之前所有的答案数加1。
题解:一开始我以为是动态规划,后来发现离散后树状数组很好做,首先,c保存的是第i位上升子系列有几个,那么树状数组的sum就直接是现在的答案了,不过更新时不要忘记加1,因为当前元素本身也是一个子序列,比如数列离散后为1 3 2 4 5,那么第一位得到之前的答案为0,更新时1位加1,第二位算出为1,更新时3位加(1+1),第三位也一样,一次类推,同树状数组求逆序对的方法一样,但是更新的不是1,而是之前所有的答案数加1。
#include <iostream> #include <cstdio> using namespace std; const int N=100005; const int mod=1000000007; struct node{int id,v;}a ; int b ,c ,n; bool cmp(node a,node b){return a.v<b.v;} int sum(int x){int s=0;while(x>0)s+=c[x],s%=mod,x-=x&-x;return s;} void updata(int x,int num){while(x<=n)c[x]+=num,c[x]%=mod,x+=x&-x;} int main(){ while(scanf("%d",&n)!=EOF){ for(int i=0;i<=n;i++)b[i]=c[i]=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i].v); a[i].id = i; } sort(a+1,a+n+1,cmp); b[a[1].id]=1; for(int i=2;i<=n;i++){ if(a[i].v!=a[i-1].v)b[a[i].id]=i; else b[a[i].id]=b[a[i-1].id]; } for(int i=1;i<=n;i++)updata(b[i],sum(b[i])+1); printf("%d\n",sum(n)); } return 0; }
相关文章推荐
- HDU 2227 Find the nondecreasing subsequences(DP)
- HDOJ 2227 HDU 2227 Find the nondecreasing subsequences ACM 2227 IN HDU
- HDU-2227 Find the nondecreasing subsequences 树状数组+DP
- Find the nondecreasing subsequences HDU 2227
- hdu 2227 Find the nondecreasing subsequences(树状数组)
- HDU 2227 Find the nondecreasing subsequences(线段树+离散化+DP)
- HDU 2227 Find the nondecreasing subsequences
- HDU--2227--Find the nondecreasing subsequences--线段树
- HDU 2227 Find the nondecreasing subsequences(DP)
- HDU 2227 Find the nondecreasing subsequences
- HDU 2227 Find the nondecreasing subsequences (线段树)
- hdu-2227-Find the nondecreasing subsequences(DP+离散化+树状数组)
- hdu 2227 Find the nondecreasing subsequences【离散化+树状数组+DP思路】
- HDU 2227 Find the nondecreasing subsequences
- hdu 2227 Find the nondecreasing subsequences(树状数组+排序)
- HDU_2227_FindTheNondecreasingSubsequences
- HDU - 2227 Find the nondecreasing subsequences
- hdu 2227 Find the nondecreasing subsequences
- hdu 2227 Find the nondecreasing subsequences(树状数组+DP)
- HDU - 2227 Find the nondecreasing subsequences (树状数组 + 子序列 + 离散化)