D. XOR- 총 (사고 + 접두사 XOR + 폭력)

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;
}

 

추천

출처blog.csdn.net/zstuyyyyccccbbbb/article/details/110404960