原题链接
解题代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define mod 1000000007
int a[250005],b[250005];
int c[250005];
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
memset(c,0,sizeof(c));
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i]);
a[i]-=i;
}
for(int i=1;i<=N;i++)
scanf("%d",&b[i]);
sort(b+1,b+1+N);
for(int i=N;i>=1;i--)
c[i]=max(c[i+1],a[i]);
long long int sum=0;
int max1=-1;
for(int i=1;i<=N;i++)
{
int x=max(c[b[i]],max1);
sum+=x;
sum%=mod;
max1=max(max1,x-N-i);
}
printf("%lld\n",(sum+mod)%mod);
}
return 0;
}

本文提供了一段算法竞赛的解题代码,通过动态规划等技术解决特定问题。代码使用C++编写,涉及数组操作、快速排序及最大值更新等关键步骤。
302

被折叠的 条评论
为什么被折叠?



