HDU 6047 Maximum Sequence

来源:互联网 发布:自干五 知乎 编辑:程序博客网 时间:2024/06/06 08:47

题目

/*    只要记录当前位置到n中间的最大值 和更新出来的数中的最大值进行比较取最大的那个*/#include<cstdio>#include<cstring>#include<algorithm>#define mod 1000000007using namespace std;long long a[300000],b[300000];long long maxa[300000];int main(){    int n;    while(scanf("%d",&n)==1)    {        memset(maxa,0,sizeof(maxa));        for(int i=1; i<=n; i++)        {            long long aa;            scanf("%lld",&aa);            a[i]=aa-i;        }        ///倒序更新        for(int i=n; i>=1; 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 t=maxa[b[1]]-n-1;///a[j]-j更新        for(int i=2; i<=n; i++)        {            maxa[b[i]]=max(maxa[b[i]],t);///与更新出来的数中的最大值进行比较取最大            ans+=maxa[b[i]];            ans%=mod;            t=max(t,maxa[b[i]]-n-i);///确定更新出来的最大数        }        printf("%lld\n",ans);    }}
原创粉丝点击