提交时间:2025-06-02 14:11:32

运行 ID: 37921

#include<bits/stdc++.h> #define ll long long #define ppc __builtin_popcountll #define clz __builtin_clzll using namespace std; const int N=2e5+10; ll a0[N],b0[N],b[N],c[N],d[N],p[N]; ll lb(ll x){return x&(-x);} ll hb(ll x){ return 1<<(63-clz(x)); } int n; multiset<int> s1,s2; ll sum1=0,sum2=0; void msz(){ //cout<<"sz "<<s1.size()<<' '<<s2.size()<<' '<<sum1<<' '<<sum2<<endl; while(s1.size()>=s2.size()+2){ int v=*(--s1.end()); s1.erase(s1.find(v));sum1-=v; s2.insert(v);sum2+=v; } while(s2.size()>s1.size()){ int v=*s2.begin(); s2.erase(s2.find(v));sum2-=v; s1.insert(v);sum1+=v; } } void ins(int x){ s1.insert(x);sum1+=x; if(s2.size()){ if(*(--s1.end())>*s2.begin()){ int v=*(--s1.end()); sum1-=v;sum2+=v; s1.erase(s1.find(v));s2.insert(v); } } msz(); } void del(int x){ if(s1.find(x)!=s1.end()) s1.erase(s1.find(x)),sum1-=x; else s2.erase(s2.find(x)),sum2-=x; msz(); } void slv2(); void slv(){ ios::sync_with_stdio(0);cin.tie(0); //cout<<a0[1]<<' '<<b0[1]<<endl; cin>>n; for(int i=1;i<=n;i++) cin>>a0[i]; for(int i=1;i<=n;i++) cin>>b0[i]; /* for(int i=1;i<=n;i++) p[i]=a0[i]; slv2(); for(int i=1;i<=n;i++) a0[i]=p[i]; */ ll ans=1e18; for(int i=0;i<=30;i++){ int U=(1<<i)-1; auto cmp=[&](int x,int y){ return (a0[x]&U)<(a0[y]&U); }; s1.clear();s2.clear();sum1=0;sum2=0; ll cost=0; for(int j=1;j<=n;j++) p[j]=j; sort(p+1,p+n+1,cmp); for(int j=1;j<=n;j++) c[j]=a0[p[j]]>>i,d[j]=a0[p[j]]&U; for(int j=1;j<=n;j++) b[j]=b0[p[j]]; for(int j=1;j<=n;j++){ ins(max(b[j]-c[j],0ll)); cost+=max(c[j]-b[j],0ll); } //cout<<sum1<<' '<<sum2<<endl; //cout<<c[1]<<' '<<b[1]<<endl; //if(i==6){for(int j=1;j<=n;j++) cout<<c[j]<<' '<<b[j]<<endl; //cout<<sum1<<' '<<sum2<<' '<<s1.size()<<' '<<s2.size()<<' '<<cost<<endl; //} // ll w=i+cost; ll val=*(--s1.end()); w+=val;//cout<<val<<endl; w+=1ll*s1.size()*val-sum1; w+=sum2-1ll*s2.size()*val; ans=min(ans,w); // d[0]=0; if(i!=0) for(int j=n;j>=1;j--){ del(max(b[j]-c[j],0ll)); cost-=max(c[j]-b[j],0ll); ins(max(b[j]-c[j]-1,0ll)); cost+=max(c[j]+1-b[j],0ll); if(j==1||d[j]!=d[j-1]){ ll w=0; if(j!=1){ w=i-ppc(d[j]|(hb(d[j]^d[j-1])-1))+1; //cout<<U<<' '<<d[j]<<' '<<d[j-1]<<' '<<w<<endl; }else{ ll now=d[j]; //if(i==30) cout<<now<<' '<<U<<endl; for(int k=i;k>=0;k--){ if(now+(1<<k)<=U) now+=(1<<k),w++; }//cout<<w<<endl; w++; }w+=cost+i; //cout<<"w: "<<w<<endl; ll val=*(--s1.end()); w+=val; w+=1ll*s1.size()*val-sum1; w+=sum2-1ll*s2.size()*val; ans=min(ans,w); } } }cout<<ans<<endl; } bool chk(int k){ ll c1=0,c2=1; for(int i=1;i<=n;i++){ c1+=abs(a0[i]+k-b0[i]);c2+=abs(a0[i]+k+1-b0[i]); }return (c2<=c1); } void slv2(){ int cnt=0;ll ans=1e18; while(1){ ll sum=0; for(int i=1;i<=n;i++) sum+=a0[i]; int l=0,r=(1<<30); while(l<r){ int mid=(l+r)/2; if(chk(mid)) l=mid+1; else r=mid; } ll res=cnt+l; for(int i=1;i<=n;i++) res+=abs(a0[i]+l-b0[i]); for(int i=1;i<=n;i++) a0[i]=a0[i]/2;cnt++; ans=min(ans,res); if(sum==0) break; } /*while(chk()){cnt++;for(int i=1;i<=n;i++) a[i]=a[i]/2;} //cout<<a[1]<<' '<<cnt<<' '; for(int i=1;i<=n;i++) cout<<a[i]<<' ';cout<<endl; ll ans=0; cnt+=l; for(int i=1;i<=n;i++) ans+=abs(a[i]+l-b[i]);*/ cout<<ans<<endl; } int main(){ int t;cin>>t; while(t--) slv(); return 0; }