【题解】CF2119C
前言
- 2025.7.6写
- 题目链接
思路
这里记
- {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;
}

浙公网安备 33010602011771号