/*
只要记录当前位置到n中间的最大值 和更新出来的数中的最大值进行比较取最大的那个
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 1000000007
using 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);
}
}
HDU 6047 Maximum Sequence
最新推荐文章于 2017-08-23 10:40:55 发布