提交时间:2025-06-02 13:53:32

运行 ID: 37914

#include<bits/stdc++.h> using namespace std; #define int long long int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=500010,N=30,inf=1e18; int n,m,ans; struct node{ int p,q,t; bool operator<(const node&G)const{ return q<G.q; } }a[MAXN]; int get(int l,int r){ int res=0,x=0; for(int i=N;~i;i--){ if(x+(1<<i)<=r)x+=1<<i,res++; if(x>=l)return res; } return inf; } multiset<int>st1,st2; int sum1,sum2,sum; void clear(){ sum1=sum2=sum=0; st1.clear(),st2.clear(); } void insert(int x){ sum+=abs(x); if(st2.size()==st1.size()){ if(st1.empty()){st2.insert(x);sum2+=x;return;} int z=*st1.rbegin(); st1.erase(st1.find(z)); sum1-=z; if(x<z)st1.insert(x),st2.insert(z),sum1+=x,sum2+=z; else st1.insert(z),st2.insert(x),sum1+=z,sum2+=x; return; } int y=*st2.begin(); st2.erase(st2.find(y)); sum2-=y; if(x<y)st1.insert(x),st2.insert(y),sum1+=x,sum2+=y; else st1.insert(y),st2.insert(x),sum1+=y,sum2+=x; } void erase(int x){ sum-=abs(x); int y=*st2.begin(); if(x<y){ st1.erase(st1.find(x)),sum1-=x; if(st1.size()<st2.size()-1)st2.erase(st2.find(y)),st1.insert(y),sum2-=y,sum1+=y; } else{ int z=*st1.rbegin(); st2.erase(st2.find(x)),sum2-=x; if(st1.size()>st2.size())st1.erase(st1.find(z)),st2.insert(z),sum1-=z,sum2+=z; } } int query(){ if(st1.empty())return sum; int x=*st1.rbegin(); int tmp=0; if(x<0)return sum; return sum2-x*(int)st2.size()+x*(int)st1.size()-sum1+x; } void slv(){ n=read(),ans=inf,m=(n-1)/2+1; for(int i=1;i<=n;i++)a[i].p=read(),a[i].q=0; for(int i=1;i<=n;i++)a[i].t=read(); for(int o=0;o<N;o++){ sort(a+1,a+n+1); clear(); for(int i=1;i<=n;i++)insert(a[i].t-a[i].p); int tmp=query(); for(int i=n;i>1;i--){ erase(a[i].t-a[i].p),insert(a[i].t-a[i].p-1); tmp=min(tmp,query()+get((1<<o)-a[i].q,(1<<o)-a[i-1].q-1)); } ans=min(ans,tmp+o); for(int i=1;i<=n;i++)a[i].q|=(a[i].p&1)<<o,a[i].p>>=1; } printf("%lld\n",ans); } signed main(){ // freopen("op.in","r",stdin);freopen("op.out","w",stdout); int _=read();while(_--) slv(); // cerr<<(clock()*1.0)/CLOCKS_PER_SEC<<"s"<<endl; return 0; }