#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
const int Q=1e9+7;
struct node{
int x;
int id;
friend bool operator<(node n1,node n2)
{
return n1.x<n2.x;
}
}ra[2500010];
int a[250010],b[250010];
int n;
int ans;
int main()
{
while(scanf("%d",&n)!=EOF)
{
priority_queue<node> q;
ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
ra[i].x=a[i]-(i+1);
ra[i].id=i+1;
q.push(ra[i]);
}
for(int j=0;j<n;j++)
scanf("%d",&b[j]);
sort(b,b+n);
int j=0;
int k=0;
node t;
for(int i=n+1;i<=2*n;i++,k++)
{
t=q.top();
if(b[k]<=t.id)
{
ans=(ans+t.x)%Q;
ra[i].id=i;
ra[i].x=(t.x-i)%Q;
q.push(ra[i]);
//cout<<ans<<endl;
}
else{
while(b[k]>t.id){
q.pop();
t=q.top();
}
ans=(ans+t.x)%Q;
ra[i].id=i;
ra[i].x=(t.x-i)%Q;
q.push(ra[i]);
// cout<<ans<<endl;
}
}
printf("%d\n",ans);
}
}
HDU6047优先队列+贪心
最新推荐文章于 2018-01-19 14:57:39 发布