https://codeforces.com/contest/1457/problem/D
그건 그렇고,이 D는 식사 후 400 명 이상을 해킹했습니다.
아이디어 : 답이 -1, 1, 2에 불과하다는 것을 알기 시작했지만 그렇지 않았습니다.
구조는 3 개의 연속 비트 중 가장 높은 1 위치가 동일하면 목표를 한 번 달성 할 수 있음을 발견합니다.
그렇다면이 경우 한계는 무엇입니까?
0001
0010
0011
01 ??
01 ??
1???
1???
최대 값 1e9의 경우 시퀀스에 충돌이없는 경우 60 개의 숫자가 있음을 알 수 있습니다. 나머지는 한 번만 가능합니다.
그런 다음 주제는 60 미만으로 정리됩니다.
두 가지 상황을 고려하십시오. 하나는 범위의 최고점 또는 최저점이 직접 XOR됩니다. (n ^ 2)
다른 하나는 두 개의 연속 된 간격이 개별적으로 XOR 된 다음 병합되는 경우입니다. (n ^ 3)
코드에서 경계 a [n + 1] = 1e18을 설정합니다.
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=100;
typedef long long LL;
LL a[maxn];
LL sum[maxn];
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
LL n;cin>>n;
if(n>60){
cout<<"1"<<endl;
return 0;
}
a[n+1]=1e18;
for(LL i=1;i<=n;i++) cin>>a[i];
for(LL i=1;i<=n;i++){
sum[i]=sum[i-1]^a[i];
}
LL res=1e18;
for(LL l=1;l<=n;l++){
for(LL r=l+1;r<=n;r++){
LL t=sum[r]^sum[l-1];
if(t>a[r+1]||t<a[l-1]){
res=min(res,r-l+1-1);
/// debug(res);
}
}
}
for(LL i=1;i<=n;i++){///[i,j][j+1,k]
for(LL j=i+1;j<=n;j++){
for(LL k=j+1;k<=n;k++){
LL t1=sum[j]^sum[i-1];
LL t2=sum[k]^sum[j];
if(t1>t2){
res=min(res,k-j+1-1+j-i+1-1-1);
}
}
}
}
if(res==1e18){
cout<<"-1"<<endl;
}
else cout<<res<<endl;
return 0;
}