先把b升序排序,这样使用b的时候从小的开始用,这样选择范围大,可以确保开始的时候就能尽量的选到大的aj-j,这样后边得到的aj-j也是尽量的大的。
a数组是动态变化的,而且每次都要选出最大的aj-j,所以用优先队列来维护
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 250010;
int b[MAXN*2];
const int mod = 1e9+7;
struct node
{
node(){}
node(int _num, int _index, int _der):num(_num),index(_index),der(_der){}
int num,index,der;
bool operator < (const node& b) const
{
return der < b.der;
}
};
int n;
int main()
{
node temp;
ios::sync_with_stdio(false);
while(cin >> n)
{
int res = 0;
priority_queue<node> que;
for(int i = 1; i <= n; ++i)
{
cin >> temp.num;
temp.index = i;
temp.der = temp.num-i;
que.push(temp);
}
for(int i = 1; i <= n; ++i) cin >> b[i];
sort(b+1,b+1+n);
for(int i = 1; i <= n; ++i)
{
while(que.top().index < b[i])
que.pop();
res = (res + que.top().der%mod)%mod;
que.push(node(que.top().der,n+i,que.top().der-n-i));
}
cout << res <<endl;
}
return 0;
}