题意:
给你a、b两个长度为n的数组,要求在a数组后填入你n个数组,要遵循 ai ≤max{ aj -j│ bk ≤j<i}的规律,每个b只能选一次。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
long long mod = 1000000007;
const int N = 500000+5;
int c[N];
int b[N];
int vis[N];
int d[250000];
void init()
{
d[n] = c[n];
for(int i = n-1; i >= 1; i--)
{
d[i] = max(d[i+1],c[i]);
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(vis,0,sizeof(vis));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(int i = 1; i <= n; i++)
{
int a;
scanf("%d",&a);
c[i] = a - i;
}
for(int i = 1; i <= n; i++)
{
scanf("%d",&b[i]);
}
init();
sort(b+1,b+n+1);
int p1 = d[b[1]] - n -1;
long long ans = 0;
for(int i = 1; i <= n; i++)
{
int add = max(d[b[i]],p1);
ans = (ans%mod + add%mod)%mod;
}
printf("%I64d\n",ans);
}
}