HDU

来源:互联网 发布:软件评测师培训费用 编辑:程序博客网 时间:2024/06/18 05:28

https://vjudge.net/problem/HDU-3450

直接用dp[i]表示以最后一个结尾的完美序列的个数。。

然后就可以用树状数组优化了

int num[N],val[N],cnt,tree[N<<2];const int maxn=500010;int d,n;int dp[N];int haxi(int x){    return lower_bound(val+1,val+1+cnt,x)-val;}int lowbit(int x){return x&(-x);}int query(int x){    int ret=0;    while(x){        ret+=tree[x];        x-=lowbit(x);    }    return ret%mod;}void add(int x,int v){    while(x<=maxn){        tree[x]+=v;        tree[x]%=mod;        x+=lowbit(x);    }}int main(){    //freopen("in.txt","r",stdin);    while(~sf("%d%d",&n,&d)){        mem(tree,0);        cnt=0;        rep(i,1,n){ sf("%d",&num[i]);val[++cnt]=num[i];val[++cnt]=num[i]+d;val[++cnt]=num[i]-d; }        sort(val+1,val+1+cnt);        cnt=unique(val+1,val+1+cnt)-val;        int ans=0;        for(int i=1;i<=n;++i){            int x=query(haxi(num[i]+d))-query(haxi(num[i]-d)-1);            dp[i]=(x+mod)%mod;            ans+=x;            add(haxi(num[i]),dp[i]+1);            //pf("%d\n",dp[i]);        }        ans=(ans+mod)%mod;        pf("%d\n",ans);    }}
原创粉丝点击