hdu-6047-Maximum Sequence

来源:互联网 发布:apache php 7.1 配置 编辑:程序博客网 时间:2024/06/10 06:19


题目链接在这里


题意分析:题目给了两行数  a[ ],和 b[ ],a[ i ]=max{ a[j]-j  |  b[k ]<=j<i  }  根据b数组限定的范围来选出一个最大的  a 最为a 序列的下一个数。   要求 求出 a[ n+1 ]~~a[ 2*n ]  之间的所有数的和  对  1e9+7 取 模 。

解题分析:

用样例来分析

a: 8 11 8 5

a[i]-i: 7  9  5  1

b:3 1 4 2

先将b排序得到  b: 1 2 3 4

那么取第一个b[0]=1 那么取到9

a:8 11 8 5 9

a[i]-i: 7 9 5 1 4

b[1]=2 还是取到 9

a: 8 11 8 5 9 9

a[i]-i: 7 9 5 1 4 3

后面继续这样取最终得到的是

a: 8 11 8 5 9 9 5 4  多出来的就是 27


很明显可以看出  b序列要从小往大取才能达到最优。

  如果每次都用 双重for循环来找max的话,肯定会超时的  ,  这里我用了一个  maxa数组来将  最后一个值到  a[  i ]  d的最大值存在  maxa[ i ] 中,这样每次去最大 的a时  就是  a[ b [ k ] ];


代码:

#include<cstdio>#include<algorithm>#include<cstring>#define mod 1000000007using namespace std;long long int a[300005],b[250005];long long int maxa[300005];int main(){    int n;    while(~scanf("%d",&n)){        memset(maxa,0,sizeof(maxa));        for(int i=1;i<=n;i++){            scanf("%lld",&a[i]);            a[i]=a[i]-i;        }        for(int i=n;i>0;i--)            maxa[i]=max(maxa[i+1],a[i]);        for(int i=1;i<=n;i++)            scanf("%lld",&b[i]);        sort(b+1,b+n+1);        long long ans=0;        ans+=maxa[b[1]];        ans%=mod;        long long aa=maxa[b[1]]-n-1;        for(int i=2;i<=n;i++){            maxa[b[i]]=max(maxa[b[i]],aa);            ans+=maxa[b[i]];            ans%=mod;            aa=max(aa,maxa[b[i]]-n-i);        }        printf("%lld\n",ans);    }    return 0;}


原创粉丝点击