rt,万分感谢!
#include <iostream>
#define inf 1145141919
#define pii pair<int,int>
#define rr register
#define mp make_pair
#define Min(a,b) ((a.first<b.first)?(a):(b))
using namespace std;
const int maxn=1e5+1;
struct node{
int val,index;
}t[maxn<<2];
int n,R,ans[maxn],s[maxn],a[maxn],pre[maxn],nxt[maxn];
inline void del(int id){
pre[nxt[id]]=pre[id];
nxt[pre[id]]=nxt[id];
return;
}
inline void pushup(int id){
if(t[id<<1].val<t[id<<1|1].val) t[id].val=t[id<<1].val,t[id].index=t[id<<1].index;
else t[id].val=t[id<<1|1].val,t[id].index=t[id<<1|1].index;
return;
}
inline void build(int id,int l,int r){
if(l==r){
t[id].val=a[l];
t[id].index=l;
return;
}
int mid=(r-l>>1)+l;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
pushup(id);
return;
}
inline void change(int id,int l,int r,int x,int k){
if(l==r&&l==x){
t[id].val=k;
return;
}
int mid=(r-l>>1)+l;
if(x<=mid) change(id<<1,l,mid,x,k);
else change(id<<1|1,mid+1,r,x,k);
pushup(id);
return;
}
inline pii sch(int id,int l,int r,int p,int q){
if(l>=p&&r<=q) return mp(t[id].val,t[id].index);
pii c=mp(inf,inf);
int mid=(r-l>>1)+l;
if(p<=mid) c=Min(c,sch(id<<1,l,mid,p,q));
if(q>mid) c=Min(c,sch(id<<1|1,mid+1,r,p,q));
return c;
}
int getint(){
int x=0,f=1;
char ch=getchar();
while(ch<48||ch>57){
if(ch==45) f=-1;
ch=getchar();
}
while(ch>=48&&ch<=57){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f*x;
}
void putint(int x){
if(x<0) x=-x,putchar(45);
if(x>9) putint(x/10);
putchar(x%10+48);
return;
}
int main(){
n=getint();
for(rr int i=1;i<=n;i++) s[i]=getint();
for(rr int i=1;i<=n;i++) a[i]=getint(),ans[n]+=a[i],pre[i]=i-1,nxt[i]=i+1;
build(1,1,n),ans[n]+=(s[n]<<1),R=n;
for(rr int i=n-1;i;i--){
pii tt=sch(1,1,n,1,R-1);
int t1=ans[i+1]-tt.first,t2=ans[i+1]-(s[R]<<1)-a[R]+(s[pre[R]]<<1);
if(t2>t1){
int tmp=R;
R=pre[R];
ans[i]=t2;
del(tmp);
}
else{
del(tt.second);
change(1,1,n,tt.second,inf);
ans[i]=t1;
}
}
for(rr int i=1;i<=n;i++) putint(ans[i]),putchar(10);
return 0;
}