【题解】CF2119C

前言

思路

这里记

  • {l,r}={al xor al+1 ... ar}
  • (l,r)={al ans al+1 ... ar}
  • [l,r]=(al,al+1...,ar)

容易发现

当n为奇数时

  • 序列所有元素都为l时,满足相等且最小

当n为偶数时

  • 设k=1<<(log2(l)+1)
  • [1,n-2]都为l,[n-1,n]都为k,满足相等且最小
  • 当k>r时 ans=-1

证明

当n为奇数时

正确性

  • 设m=n-1
  • 由于xor满足自反性,所以{1,m}=0
  • 所以{1,n}={1,m} xor an= l =(1,n)

最小性

  • 由于l最小,所以字典序最小

当n为偶数时

  • 设m=n-2,k=1<<(log2(l)+1)

正确性

  • 因为(1,m)=l,且k与l二进制位上无交集
  • 所以(1,n)=(1,m) and k and k=0
  • 因为{1,m}=0
  • 所以{1,n}={1,m} xor (k xor k)={1,m}=0
  • 所以{1,n}=(1,n)

最小性

  • 假设不为最小
  • 分两种情况讨论
    [1,n-1]=l,[n,n]=s
    • 显然不相等(分类讨论n>=k,n<k)
    [1,n-2]=l,[n-1,n-1]=s,[n,n]=t
    • 此时l<s<=k,l<t
    • 若s=k,则l<t<k
    • 显然不相等
    • 若l<s<k,则l<t<k (t>=k时显然不相等)
    • 因为{1,m}=0,(1,m)=l
    • s xor t =s and t and l
    • s,t,l最高位相同
    • 所以s xor t != s ans t ans l
    • 所以不相等
  • 综上
  • 此时最小

代码

#include<bits/stdc++.h>
#define double long double
#define eps 1e-8
#define int long long
using namespace std;
const int N=2e5+10;
double ar[N];
void solve(){
	int n,l,r,x;cin>>n>>l>>r>>x;
	if(n==2) cout<<-1<<"\n";
	else if(n&1) cout<<l<<"\n";
	else{
		int k=pow(2ll,((int)log2(l)+1));
		if(k>r) cout<<-1<<"\n";
		else{
			if(x<=n-2) cout<<l<<"\n";
			else cout<<k<<"\n";
		}
	}
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int t;cin>>t;
	while(t--) solve();
	return 0;
}
posted @ 2025-07-06 19:26  Ming3398  阅读(327)  评论(0)    收藏  举报