提交时间:2025-04-06 11:11:50
运行 ID: 37534
#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]; priority_queue<int,vector<int>,greater<int>>Q,P; int num; void DP(int x,int y){ while(!Q.empty()&&num+Q.top()<=y)f[++m]=(num+=Q.top()),Q.pop(); Q.push(x-y); if(Q.top()==x-y||num+Q.top()>x){ int tmp=Q.top();Q.pop(); if(!Q.empty()){ int ttmp=Q.top();Q.pop(); Q.push(tmp+ttmp+num-x); } Q.push(0),num=x; } } void clear(){ while(!Q.empty())f[++m]=(num+=Q.top()),Q.pop(); } 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)DP(a[i].x,a[i].y); clear(); // for(int i=1;i<=m;i++)cout<<f[i]<<" ";cout<<endl; 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; }