题意很难看懂。
给你一个长度为 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]是要包括这些值在内的。
题解:
- Max[]数组存下从第i个数到第n 个数之间最大的数。(这里有个我觉得很不错的方法 , 从后面到前面挨个存最大的值)
- 将Max[]数组存入优先队列。
- 拿最大值和优先队列里的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;
}