題意
給定長度爲n的數列A和數列B,利用已經存在的兩數列A,B生成A數列的後續
分析
要求取最大值,顯然
代碼
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
#define LL long long
#define MAXN 250250
const int mod=1e9+7;
struct Node{
int v,idx;
Node(int _v,int _idx):v(_v),idx(_idx){}
Node(){}
friend bool operator<(Node n1,Node n2){
if(n1.v!=n2.v)
return n1.v<n2.v;
return n1.idx<n2.idx;
}
};
int bin[MAXN];
int a[MAXN];
int b[MAXN];
int lowbit(int x){
return x&-x;
}
int sum(int x){
int ret=0;
while(x){
ret+=bin[x];
x-=lowbit(x);
}
return ret;
}
int add(int x){
while(x<MAXN){
bin[x]++;
x+=lowbit(x);
}
}
int query(int x,int y){
return sum(y)-sum(x-1);
}
int main(){
int n;
while(~scanf("%d",&n)){
priority_queue<Node> q;
memset(bin,0,sizeof(bin));
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
q.push(Node(a[i]-i,i));
}
for(int i=1;i<=n;++i){
scanf("%d",&b[i]);
add(b[i]);
}
LL ans=0;
int res=n,mx=0,pos=n+1;
while(res && !q.empty()){
Node tmp=q.top();
q.pop();
if(tmp.idx<=mx)
continue;
if(tmp.idx>mx){
if(tmp.idx>n){
ans+=tmp.v*1ll*res;
res=0;
continue;
}
else{
int num=query(mx+1,tmp.idx);
ans+=tmp.v*1ll*num;
q.push(Node(tmp.v-pos,pos));
pos+=num;
res-=num;
mx=tmp.idx;
continue;
}
}
}
ans%=mod;
printf("%I64d\n",ans);
}
}