我用一个非常鬼的方法 A 了这道题
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
const int MAXN=1e5+5;
int n,maxn=0,pos,maxr=0,s[MAXN],a[MAXN];
struct node{
int dis,val; node():dis(0),val(0){}
node(int dis,int val):dis(dis),val(val){}
bool operator<(const node&b) const{
return val+2*max(0,dis-maxr)<b.val+2*max(0,b.dis-maxr);
}
};
priority_queue<node>q;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&s[i]);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
if(s[i]*2+a[i]>maxn)
maxn=s[i]*2+a[i],pos=i,
maxr=s[i];
for(int i=1;i<=n;i++) if(i!=pos) q.push({s[i],a[i]});
printf("%d\n",maxn);
for(int i=2;i<=n;i++)
printf("%d\n",maxn+=q.top().val+2*max(0,q.top().dis-maxr)),
maxr=max(maxr,q.top().dis),q.pop();
return 0;
}
但这个代码是有问题的,所以申请添加这组 hack 数据:
7
0 3 3 2 1 3 2
100 26 18 19 20 18 18
正常的输出应该是
100
132
152
171
189
207
225
但这个程序的输出是
100
132
151
171
189
207
225
会在第二个数出错。