提交时间:2025-04-06 09:29:45
运行 ID: 37530
#include<bits/stdc++.h> using namespace std; #define int long long #define lson (t[pos].ls) #define rson (t[pos].rs) #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define x1 lylakioi #define y1 gczakioi #define lb(x) (x&(-x)) #define popcnt __builtin_popcount #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v #pragma gcc optimize(2) int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} string reads(){string res=".";char c=getchar();while(c<'a'||c>'z')c=getchar();while(c>='a'&&c<='z')res=res+c,c=getchar();return res;} void write(int x){if(x<0){putchar('-');x=-x;}if(x>9) write(x/10);putchar(x%10+'0');} const int MAXN=500010,MAXM=200010,N=30,M=550000,Mod=998244353,inf=1e18,B=300; struct Edge{int v,nx,w;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,k; struct node{ int x,y; }a[MAXN]; bool cmpx(node x,node y){return x.x<y.x;} bool cmpy(node x,node y){return x.y<y.y;} int p[MAXN],q[MAXN],f[MAXN],as[MAXN]; struct treap{ int pri,val,sum,ls,rs; }t[MAXN]; void pushup(int pos){ t[pos].sum=t[lson].sum+t[rson].sum+t[pos].val; } int mrge(int x,int y){ if(!x||!y)return x|y; if(t[x].pri<t[y].pri){ t[x].rs=mrge(t[x].rs,y); pushup(x); return x; } else{ t[y].ls=mrge(x,t[y].ls); pushup(y); return y; } } pii split(int pos,int key){ if(!pos)return mk(0,0); if(t[lson].sum>=key){ pii tmp=split(lson,key); lson=tmp.sc; pushup(pos); return mk(tmp.fr,pos); } else{ pii tmp=split(rson,key-t[lson].sum-t[pos].val); rson=tmp.fr; pushup(pos); return mk(pos,tmp.sc); } } void DP(int x,int y){ } void slv(){ n=read(); for(int i=1;i<=n;i++)a[i].x=read(); for(int i=1;i<=n;i++)a[i].y=read(); sort(a+1,a+n+1,cmpx); int now=0,sum=0; for(int i=1;i<=n;i++)if(a[i].x<=a[i].y){ if(now>=a[i].x)now-=a[i].x,now+=a[i].y; else{ sum+=a[i].x-now,now=a[i].x; now-=a[i].x,now+=a[i].y; } p[++k]=sum; q[k]=now; } sort(a+1,a+n+1,cmpy); memset(f,0x3f,sizeof(f)); f[0]=0; for(int i=1;i<=n;i++)if(a[i].x>a[i].y){ m++; // DP(a[i].x,a[i].y); for(int j=m;j>=1;j--)f[j]=min(f[j],max(f[j-1],a[i].y)+a[i].x-a[i].y); } memset(as,0x3f,sizeof(as)); p[k+1]=inf; for(int i=0,j=0;i<=k;i++){ if(j)j--; while(j<=m&&max(0ll,f[j]-q[i])+p[i]<p[i+1])as[i+j]=max(0ll,f[j]-q[i])+p[i],j++; } for(int i=n;i>=1;i--)as[i]=min(as[i+1],as[i]); for(int i=1;i<=n;i++)printf("%lld ",as[i]); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); // int _=read();while(_--) slv(); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s"<<endl; return 0; }