hdu 2227 Find the nondecreasing subsequences 树状数组+简单DP

题意就不说了

有几个值得注意的地方,首先,数据范围太大,要离散化

有一个问题就是1 5 5

离散化后可能是1 3 2

本来应该是1 2 3的,就会出错

所以排序的时候加个按关键值排序,值相同时按id递增排序

View Code
#include<cstdio>
#include<algorithm>
using namespace std;
const int mod=1000000007;
const int maxn=100000;
struct node{
int num;
int id;
}a[maxn+10];
__int64 dp[maxn+10];
int num[maxn+10];
int cmp(node a,node b){
if(a.num!=b.num)
return a.num<b.num;
return a.id<b.id;
}
int lowbit(int x){
return x&-x;
}
void update(int x,__int64 d){
for(;x<=maxn;x+=lowbit(x)){
dp[x]+=d;
if(dp[x]>=mod) dp[x]-=mod;
}
}
__int64 sum(int x){
__int64 ans=0;
for(;x>0;x-=lowbit(x)){
ans+=dp[x];
if(ans>=mod) ans-=mod;
}
return ans;
}
int main(){
int n,i;
__int64 ans;
while(scanf("%d",&n)!=EOF){
ans=0;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
scanf("%d",&a[i].num);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++){
__int64 s=sum(a[i].id)+1;
update(a[i].id,s);
ans+=s;
if(ans>=mod) ans-=mod;
}
printf("%I64d\n",ans);
}
return 0;
}



posted @ 2012-01-12 18:08  Because Of You  Views(296)  Comments(0Edit  收藏  举报