【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=6047
题目意思
给你两个数组a,b。没个数组都有n个元素,接着求a【n+1】到啊【2*n 】,而a[i]=max{a[j]-j},b[k]
解题思路
根据题目可以知道每次a组值因为不断求出新的ai值而改变,所以设个dp数组存储区间的最大值,还有b数组限制着j能取的范围,而b数组的值的选择可以从小到大选,(比如b[3]值就能满足让ai取得最大,那么比b[3]小的值一定也满足,所以先消耗小的值)。具体看代码
代码部分
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#define MAXN 500050
#define ll long long
using namespace std;
const int MOD=
1e9+
7;
int main()
{
int n;
ll d[MAXN];
while(~
scanf(
"%d",&n))
{
ll a[MAXN];
int c,b[MAXN];
memset(d,
0,
sizeof(d));
a[
0]=
0;
b[
0]=
0;
for(
int i=
1; i<=n; i++)
{
scanf(
"%d",&c);
a[i]=c-i;
}
for(
int i=
1; i<=n; i++)
{
scanf(
"%d",&b[i]);
}
sort(b+
1,b+n+
1);
int y=n,k=
1,i=
0,pos;
ll sum=
0;
while(y<
2*n)
{
if(i>n&&a[i]<d[b[k-
1]]&&b[k]<=pos)
d[b[k]]=d[b[k-
1]];
else for(i=b[k]; i<=y; i++)
{
d[b[k]]=max(d[b[k]],a[i]);
if(d[b[k]]==a[i])pos=i;
}
i=y+
1;
a[i]=d[b[k]]-i;
sum=(sum+d[b[k]])%MOD;
k++;
y++;
}
printf(
"%lld\n",sum);
}
}