#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int lu,pb,zpb;
};
int n;
node a[100010];
int sum[100010];
int luc[100010];
bool cmp1(node x,node y){
return x.zpb >y.zpb ;
}
bool cmp2(node x,node y){
if(a[1].lu >=x.lu &&a[1].lu >=y.lu ) return x.pb >y.pb ;
else if(a[1].lu <x.lu &&a[1].lu>=y.lu ) return y.pb+a[1].lu*2+a[1].pb>x.lu*2+x.pb +a[1].pb ;
else if(a[1].lu <y.lu &&a[1].lu>=x.lu ) return x.pb+a[1].lu*2+a[1].pb>y.lu*2+y.pb+a[1].pb ;
else if(a[1].lu <x.lu &&a[1].lu <y.lu )
return x.lu*2+x.pb >y.lu*2+y.pb ;
}
signed main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].lu ;
}
for(int i=1;i<=n;i++){
cin>>a[i].pb ;
}
for(int i=1;i<=n;i++){
a[i].zpb =a[i].lu *2+a[i].pb ;
}
sort(a+1,a+n+1,cmp1);
sort(a+2,a+n+1,cmp2);
sum[1]=a[1].zpb ;
luc[1]=a[1].lu ;
cout<<a[1].zpb <<endl;
//cout<<a[1].lu <<endl;
for(int i=2;i<=n;i++){
cout<<max(luc[i-1] ,a[i].lu )*2+a[i].pb +sum[i-1]-luc[i-1]*2 <<endl;
// cout<<a[i].lu <<endl;
sum[i]=max(luc[i-1] ,a[i].lu )*2+a[i].pb +sum[i-1]-luc[i-1]*2 ;
luc[i]=max(luc[i-1] ,a[i].lu );
}
return 0;
}
我的思路跟你们好像不大一样,主要是通过排序,由于第一次销售什么都不用管只用管一家总的疲惫值,所以按总疲惫值从大到小排序,之后的n-1家,如果都比总疲惫值最高的那一家离入口近,比较疲惫值;如果一家比总疲惫值最高的那一家离入口近,一家比总疲惫值最高的那一家离入口远,则比较他们两家分别与疲惫值最高的那一家一起出售的总疲惫值。(感觉思路还是挺正确的,但就是A不了,我的同学跟我一样的情况,但思路也跟我不同)