简单题悬赏8rmb求调
  • 板块学术版
  • 楼主rnf5114
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/13 21:55
  • 上次更新2025/1/14 11:54:16
查看原帖
简单题悬赏8rmb求调
917683
rnf5114楼主2025/1/13 21:55
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int Maxn=200010;
const int inf=1000000000000000000;
int n,v,Sum[200010],a[200010],b[200010],c[200010][70],sum[70][200010],vis[70],tot,rt[200010];
void fen(int id,int x){
	int tmp=0;
	while(x){
		tmp++;
		if(x%2)
			sum[tmp-1][id]=sum[tmp-1][id-1]+1;
		x/=2;
	}
}
int work(int R){
	int l=1,r=R-1,tmp=R,awa=70;
	while(l<=r){
		int mid=(l+r)/2,flag=0;
		for(int i=0;i<=63;i++){
			if(vis[i])
				continue;
			if(sum[i][R]-sum[i][mid]!=(R-mid+1))
				flag++,awa=i;
		}
		if(flag<=1){
			r=mid-1;
			tmp=min(tmp,mid);
		}
		else
			l=mid+1;
	}
	if(awa==70)
		return tmp;
	vis[awa]=1;
	return tmp;
}
struct node{
	int son[2],v;
}t[Maxn*36];
void modify(int nw,int lst,int x){
	for(int i=63;i>=0;i--){
		t[nw].v=t[lst].v+1;
		if((x&(1ll<<i))==0){
			if(!t[nw].son[0])
				t[nw].son[0]=++tot;
			t[nw].son[1]=t[lst].son[1];
			nw=t[nw].son[0];
			lst=t[lst].son[0];
		}
		else{
			if(!t[nw].son[1])
				t[nw].son[1]=++tot;
			t[nw].son[0]=t[lst].son[0];
			nw=t[nw].son[1];
			lst=t[lst].son[1];
		}
	}
	t[nw].v=t[lst].v+1;
}
int work1(int r,int l,int x){//find min(a>=x)
	int ans=0,flag=1,qwq=1;
	for(int i=63;i>=0;i--){
		int tmp=(x&(1ll<<i));
		if(qwq&&tmp==0)
			continue;
		if(tmp)
			qwq=0,tmp=1;
//		cout<<(x&(1ll<<i))<<"aaa"<<i<<"\n";
		if(flag==0){
			if(t[t[r].son[0]].v-t[t[l].son[0]].v>0)
				r=t[r].son[0],l=t[l].son[0];
			else
				ans+=(1ll<<i),r=t[r].son[0],l=t[l].son[0];
		}
		else{
			if(tmp==0){
				if(t[t[r].son[0]].v-t[t[l].son[0]].v>0)
					r=t[r].son[0],l=t[l].son[0];
				else
					ans+=(1ll<<i),r=t[r].son[1],l=t[l].son[1],flag=0;
			}
			else{
				ans+=(1ll<<i);
				if(t[t[r].son[1]].v-t[t[l].son[1]].v<=0)
					return -inf;
				r=t[r].son[1],l=t[l].son[1];
			}
		}
	}
//	cout<<ans<<" "<<x<<"\n";
	return ans;
}
int work2(int r,int l,int x){//find max(a<=x)
	int ans=0,flag=1,qwq=1;
	for(int i=63;i>=0;i--){
		int tmp=(x&(1ll<<i));
		if(qwq&&tmp==0)
			continue;
		if(tmp)
			tmp=1,qwq=0;
		if(flag==0){
			if(t[t[r].son[1]].v-t[t[l].son[1]].v>0)
				ans+=(1ll<<i),r=t[r].son[1],l=t[l].son[1];
			else
				r=t[r].son[0],l=t[l].son[0];
		}
		else{
			if(tmp==1){
				if(t[t[r].son[1]].v-t[t[l].son[1]].v>0)
					ans+=(1ll<<i),r=t[r].son[1],l=t[l].son[1];
				else
					r=t[r].son[0],l=t[l].son[0],flag=0;	
			}
			else{
				if(t[t[r].son[0]].v-t[t[l].son[0]].v<=0)
					return -inf;
				r=t[r].son[0],l=t[l].son[0];
			}
		}
	}
//	cout<<ans<<" "<<x<<"\n";
	return ans;
}
int Find(int r,int l,int x){
	return min(abs(work1(r,l,x)-v),abs(work2(r,l,x)-v));
}
signed main(){
	cin>>n>>v;
	int ans=v;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		fen(i,a[i]);
	}
	for(int i=1;i<=n;i++)
		cin>>b[i],Sum[i]^=b[i];
	ans=min(ans,abs(v-a[1]*b[1]));
	rt[1]=++tot;
	modify(rt[1],rt[0],Sum[1]);
	for(int i=2;i<=n;i++){
//		cout<<"!!!"<<i<<"\n";
		int r=i,tmp=a[i];
		memset(vis,0,sizeof vis);
		rt[i]=++tot;
		modify(rt[i],rt[i-1],Sum[i]);
		while(r){
			tmp&=a[r];
			int l=work(r);
//			cout<<tmp<<" "<<l<<" "<<r<<"\n";
			if(tmp==0)
				break;
			int p=(v/tmp)^Sum[i];
//			cout<<"!!!"<<p<<"\n";
			l--;
			if(l==0)
				ans=min(ans,min(abs(v-p),Find(rt[i],rt[0],p)));
			else
				ans=min(ans,Find(rt[i],rt[l-1],p));
			r=l;
		}
		ans=min(ans,abs(v-a[i]*b[i]));
	}
	cout<<ans;
	return 0;
}

2025/1/13 21:55
加载中...