2017 多校2 c题(水题 贪心)

题意:

给你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);
    }
}


猜你喜欢

转载自blog.csdn.net/zlatan10/article/details/76209067