提交时间:2025-06-02 13:53:17
运行 ID: 37913
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back #define ppc __builtin_popcount using namespace std; typedef long long ll; const int maxn=1e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[maxn],b[maxn]; int gmin(int l,int r){ if(!l)return 0; int cnt=0; down(i,31,0){ if(((l>>i)&1)!=((r>>i)&1))return min(cnt+1,ppc(l)); cnt+=(l>>i)&1; } return cnt; } vector<int>vec[maxn]; int pos[maxn]; int F[maxn]; int loc[maxn]; int _loc[maxn]; void slv(){ n=read();up(i,1,n)a[i]=read();up(i,1,n)b[i]=read(); ll res=1e18; up(o,0,30){ //vector<int>V={0}; vector<pi>tt={m_p(0,0)}; vector<int>V; up(j,1,n){ int x=a[j]&((1<<o)-1); if(x!=(1<<o))tt.p_b(m_p((1<<o)-x,j)); } sort(tt.begin(),tt.end()); int cnt=0; up(i,0,(int)tt.size()-1){ int j=i;V.p_b(tt[i].p1); while(j<tt.size()&&tt[i].p1==tt[j].p1)_loc[tt[j].p2]=cnt,j++; i=j-1,cnt++; } V.p_b((1<<o)); vector<pi>vc; up(j,0,n+1)vec[j].clear(),vec[j].shrink_to_fit(); vc.p_b(m_p(0,0));F[0]=1<<o; up(j,1,n){ int x=a[j]&((1<<o)-1); vc.p_b(m_p(b[j]-(a[j]>>o),j)); F[j]=(1<<o)-x; if(x!=(1<<o)){ int p=_loc[j]; vec[p].p_b(j); } } sort(vc.begin(),vc.end(),[](pi a,pi b){if(a.p1!=b.p1)return a.p1<b.p1;return F[a.p2]<F[b.p2];}); ll sa=0,sb=0,ss=0; up(i,0,vc.size()-1){if(i<=(n+1)/2)sa+=vc[i].p1;else sb+=vc[i].p1;ss+=abs(vc[i].p1);loc[vc[i].p2]=i;} //vector<int>V; //up(j,0,(1<<o))V.p_b(j); up(j,0,V.size()-2){ for(int i:vec[j]){ int val=b[i]-(a[i]>>o); ss-=abs(val);ss+=abs(val-1); if(loc[i]<=(n+1)/2)--sa; else --sb; } int val=vc[(n+1)/2].p1; if(F[vc[(n+1)/2].p2]<=V[j])--val; ll sum=gmin(V[j],V[j+1]-1)+o; if(val<0)sum+=ss; else sum+=val*1ll*((n+1)/2+1)-sa+sb-val*1ll*(n+1-((n+1)/2+1)); res=min(res,sum); } } printf("%lld\n",res); } int main(){ //freopen("op.in","r",stdin),freopen("op.out","w",stdout); int t=read();while(t--)slv(); return 0; }