题意很难看懂。

给你一个长度为 n 的a[i]数组和b[j] 数组 , 求a[n+1] 到 a[2*n]的和 , a[n+1] 到 a[2*n]的值要满足在a[b[j]]-b[j] 到 a[end]-end 中的最大值。如果a[n+1],a[n+2]...等的值已经算出来了 , 那么a[end]是要包括这些值在内的。

题解:

  1. Max[]数组存下从第i个数到第n 个数之间最大的数。(这里有个我觉得很不错的方法  , 从后面到前面挨个存最大的值)
  2. 将Max[]数组存入优先队列。
  3. 拿最大值和优先队列里的top值比较 ,得到 a[n+1] 到 a[2*n] 的值 , 再将他们放入优先队列。

样例:

4

a[i]   8 11 8 5

b[i]   3 1 4 2

Max[i] :7 9 5 1   ------  a[i]-i

1.

选b[i] = 1 , 在a[1] ~a[4]之间最大的数为9 , 所以a[n+1] = 9 , 那么Max[n+1] =a[n+1]-(n+1)=4

Sum = 9;

Max[i] :7 9 5 1 4

2.

 选b[i] = 2 , 在a[2] ~a[5]之间最大的数为9 , 所以a[n+2] = 9 , 那么Max[n+2] =a[n+2]-(n+2)=3

Sum=9+9;

Max[i] :7 9 5 1 4 3

3.

选b[i] = 3 , 在a[3] ~a[6]之间最大的数为5 , 所以a[n+3] = 5 , 那么Max[n+3] =a[n+3]-(n+3)=-2

Sum = 9+9+5;

Max[i] :7 9 5 1 4 3 -2

4.

选b[i] = 4 , 在a[4] ~a[7]之间最大的数为4 , 所以a[n+4] = 4 , 那么Max[n+4] =a[n+4]-(n+4)=-4

Sum = 9+9+5+4;

Max[i] :7 9 5 1 4 3 -4

因此答案是27

代码:

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int maxn = 3e5+80;
int a[maxn<<1] , b[maxn] , Max[maxn];
int main()
{
    int n ;
    while(~scanf("%d" , &n))
    {
        memset(Max , 0 , sizeof(Max));
        for(int i = 1 ; i <= n ; i++)
        {
            scanf("%d" , &a[i]);
            a[i] = a[i]-i;
        }
        for(int i = 1 ; i <= n ; i++)
        {
            scanf("%d" , &b[i]);
        }
         priority_queue<int>Q;
        for(int i = n ; i >= 1 ; i--)
        {
            Max[i] = max( a[i] , Max[i+1]);
        }
        sort(b+1 , b+1+n);
        for(int i = 1 ; i <= n ; i++)
        {
            Q.push(Max[b[i]]);
        }
        int tmp = 0 , sum = 0;
        for(int i = n+1 ; i <= 2*n ; i++)
        {
            int s = Q.top();
            if(tmp > s)
            {
                a[i] = tmp-i;
            }
            else
            {
                a[i] = s - i;
                Q.pop();
            }
            sum = (sum%mod+a[i]%mod+i)% mod;
            tmp = max(tmp , a[i]);
        }
       printf("%d\n" , sum%mod);
    }
    return 0;
}