刚学OI一秒的萌新有一个问题 下面是我的代码
#include<bits/stdc++.h>
#define N 200005
#define mp make_pair
using namespace std;
typedef long long ll;
int n,b[N],c[N],now,ans;
struct node{
int id,A;
}k[N];
priority_queue<pair<int,int> > q;
bool vis[N];
bool cmp(node x,node y){return x.A<y.A;}
int main(){
freopen("self.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n+1;i++)scanf("%d",&k[i].A),k[i].id=i;
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
sort(k+1,k+n+2,cmp);
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
q.push(mp(max(k[i].A-b[i],0),i));
c[k[n+1].id]=q.top().first;
for(int i=n;i;i--){
vis[i]=1;
// while(!q.empty()&&vis[q.top().second])q.pop();
q.push(mp(max(k[i+1].A-b[i],0),i));
c[k[i].id]=q.top().first;
}
for(int i=1;i<=n+1;i++)printf("%d ",c[i]);
return 0;
}
优先队列维护最大值做法
// while(!q.empty()&&vis[q.top().second])q.pop();
为什么不要弹出,把这句加上去就WA了,就是判断这位之前有没有和其他位减过,如果减过就弹出。因为对于每一个Bi只能和一个Ai相减……
求助