結果

問題 No.911 ラッキーソート
ユーザー LayCurseLayCurse
提出日時 2019-11-02 11:30:12
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 186 ms / 2,000 ms
コード長 5,150 bytes
コンパイル時間 2,683 ms
コンパイル使用メモリ 213,864 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-09-14 23:03:42
合計ジャッジ時間 7,870 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 3 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 3 ms
5,376 KB
testcase_06 AC 3 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 3 ms
5,376 KB
testcase_09 AC 3 ms
5,376 KB
testcase_10 AC 3 ms
5,376 KB
testcase_11 AC 3 ms
5,376 KB
testcase_12 AC 3 ms
5,376 KB
testcase_13 AC 186 ms
5,376 KB
testcase_14 AC 101 ms
5,376 KB
testcase_15 AC 102 ms
5,376 KB
testcase_16 AC 103 ms
5,376 KB
testcase_17 AC 97 ms
5,376 KB
testcase_18 AC 95 ms
5,376 KB
testcase_19 AC 93 ms
5,376 KB
testcase_20 AC 88 ms
5,376 KB
testcase_21 AC 79 ms
5,376 KB
testcase_22 AC 73 ms
5,376 KB
testcase_23 AC 69 ms
5,376 KB
testcase_24 AC 62 ms
5,376 KB
testcase_25 AC 36 ms
5,376 KB
testcase_26 AC 31 ms
5,376 KB
testcase_27 AC 13 ms
5,376 KB
testcase_28 AC 7 ms
5,376 KB
testcase_29 AC 3 ms
5,376 KB
testcase_30 AC 2 ms
5,376 KB
testcase_31 AC 2 ms
5,376 KB
testcase_32 AC 2 ms
5,376 KB
testcase_33 AC 2 ms
5,376 KB
testcase_34 AC 2 ms
5,376 KB
testcase_35 AC 2 ms
5,376 KB
testcase_36 AC 2 ms
5,376 KB
testcase_37 AC 2 ms
5,376 KB
testcase_38 AC 96 ms
5,376 KB
testcase_39 AC 71 ms
5,376 KB
testcase_40 AC 4 ms
5,376 KB
testcase_41 AC 90 ms
5,376 KB
testcase_42 AC 51 ms
5,376 KB
testcase_43 AC 98 ms
5,376 KB
testcase_44 AC 16 ms
5,376 KB
testcase_45 AC 35 ms
5,376 KB
testcase_46 AC 48 ms
5,376 KB
testcase_47 AC 21 ms
5,376 KB
testcase_48 AC 14 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
inline void rd(int &x){
  int k;
  int m=0;
  x=0;
  for(;;){
    k = getchar_unlocked();
    if(k=='-'){
      m=1;
      break;
    }
    if('0'<=k&&k<='9'){
      x=k-'0';
      break;
    }
  }
  for(;;){
    k = getchar_unlocked();
    if(k<'0'||k>'9'){
      break;
    }
    x=x*10+k-'0';
  }
  if(m){
    x=-x;
  }
}
inline void rd(long long &x){
  int k;
  int m=0;
  x=0;
  for(;;){
    k = getchar_unlocked();
    if(k=='-'){
      m=1;
      break;
    }
    if('0'<=k&&k<='9'){
      x=k-'0';
      break;
    }
  }
  for(;;){
    k = getchar_unlocked();
    if(k<'0'||k>'9'){
      break;
    }
    x=x*10+k-'0';
  }
  if(m){
    x=-x;
  }
}
inline void wt_L(char a){
  putchar_unlocked(a);
}
inline void wt_L(int x){
  int s=0;
  int m=0;
  char f[10];
  if(x<0){
    m=1;
    x=-x;
  }
  while(x){
    f[s++]=x%10;
    x/=10;
  }
  if(!s){
    f[s++]=0;
  }
  if(m){
    putchar_unlocked('-');
  }
  while(s--){
    putchar_unlocked(f[s]+'0');
  }
}
inline void wt_L(unsigned x){
  int s=0;
  char f[10];
  while(x){
    f[s++]=x%10;
    x/=10;
  }
  if(!s){
    f[s++]=0;
  }
  while(s--){
    putchar_unlocked(f[s]+'0');
  }
}
inline void wt_L(long long x){
  int s=0;
  int m=0;
  char f[20];
  if(x<0){
    m=1;
    x=-x;
  }
  while(x){
    f[s++]=x%10;
    x/=10;
  }
  if(!s){
    f[s++]=0;
  }
  if(m){
    putchar_unlocked('-');
  }
  while(s--){
    putchar_unlocked(f[s]+'0');
  }
}
inline void wt_L(unsigned long long x){
  int s=0;
  char f[21];
  while(x){
    f[s++]=x%10;
    x/=10;
  }
  if(!s){
    f[s++]=0;
  }
  while(s--){
    putchar_unlocked(f[s]+'0');
  }
}
inline void wt_L(double x){
  printf("%.15f",x);
}
inline void wt_L(const char c[]){
  int i=0;
  for(i=0;c[i]!='\0';i++){
    putchar_unlocked(c[i]);
  }
}
inline void wt_L(string &x){
  int i=0;
  for(i=0;x[i]!='\0';i++){
    putchar_unlocked(x[i]);
  }
}
template<class S, class T> inline S chmin(S &a, T b){
  if(a>b){
    a=b;
  }
  return a;
}
template<class S, class T> inline S chmax(S &a, T b){
  if(a<b){
    a=b;
  }
  return a;
}
int N;
long long LL;
long long RR;
long long A[200000];
int cond[62];
int L[62];
int R[62];
void doit(int k, int a, int b){
  int i;
  int mn0;
  int mx0;
  int mn1;
  int mx1;
  if(k < 0){
    return;
  }
  mn0 = mn1 = 1073709056;
  mx0 = mx1 = -1073709056;
  for(i=(a);i<(b+1);i++){
    if(A[i] & (1LL<<k)){
      chmin(mn1, i);
      chmax(mx1, i);
    }
    else{
      chmin(mn0, i);
      chmax(mx0, i);
    }
  }
  if(mn0 == 1073709056 || mn1 == 1073709056){
    doit(k-1, a, b);
    return;
  }
  if(mx0 < mn1){
    cond[k] |= 2;
    doit(k-1, a, mx0);
    doit(k-1, mn1, b);
  }
  else if(mx1 < mn0){
    cond[k] |= 1;
    doit(k-1, a, mx1);
    doit(k-1, mn0, b);
  }
  else{
    cond[k] |= 3;
  }
}
long long dp[2][2][62];
long long solve(int x, int y, int d){
  long long res = 0;
  if(d < 0){
    return 1;
  }
  if(dp[x][y][d] >= 0){
    return dp[x][y][d];
  }
  if(!((cond[d]) &(1<<(0)))&& (L[d]==0 || x)){
    if(R[d]==1){
      res += solve(x,1, d-1);
    }
    else{
      res += solve(x,y, d-1);
    }
  }
  if(!((cond[d]) &(1<<(1)))&& (R[d]==1 || y)){
    if(L[d]==0){
      res += solve(1, y, d-1);
    }
    else{
      res += solve(x, y, d-1);
    }
  }
  return dp[x][y][d] = res;
}
int main(){
  int i;
  rd(N);
  rd(LL);
  rd(RR);
  {
    int Lj4PdHRW;
    for(Lj4PdHRW=(0);Lj4PdHRW<(N);Lj4PdHRW++){
      rd(A[Lj4PdHRW]);
    }
  }
  for(i=(0);i<(62);i++){
    if(LL&(1LL<<i)){
      L[i] = 1;
    }
  }
  for(i=(0);i<(62);i++){
    if(RR&(1LL<<i)){
      R[i] = 1;
    }
  }
  doit(61, 0, N-1);
  for(i=(0);i<(2);i++){
    int j;
    for(j=(0);j<(2);j++){
      int k;
      for(k=(0);k<(62);k++){
        dp[i][j][k] = -1;
      }
    }
  }
  wt_L(solve(0,0,61));
  wt_L('\n');
  return 0;
}
// cLay varsion 20191102-1

// --- original code ---
// int N; ll LL, RR;
// ll A[2d5];
// 
// int cond[62];
// int L[62], R[62];
// 
// void doit(int k, int a, int b){
//   int mn0, mx0, mn1, mx1;
//   if(k < 0) return;
//   mn0 = mn1 = int_inf;
//   mx0 = mx1 = -int_inf;
//   rep(i,a,b+1){
//     if(A[i] & (1LL<<k)){
//       mn1 <?= i;
//       mx1 >?= i;
//     } else {
//       mn0 <?= i;
//       mx0 >?= i;
//     }
//   }
//   if(mn0 == int_inf || mn1 == int_inf) doit(k-1, a, b), return;
//   if(mx0 < mn1){
//     cond[k] |= 2;
//     doit(k-1, a, mx0);
//     doit(k-1, mn1, b);
//   } else if(mx1 < mn0){
//     cond[k] |= 1;
//     doit(k-1, a, mx1);
//     doit(k-1, mn0, b);
//   } else {
//     cond[k] |= 3;
//   }
// }
// 
// ll dp[2][2][62];
// ll solve(int x, int y, int d){
//   ll res = 0;
//   if(d < 0) return 1;
//   if(dp[x][y][d] >= 0) return dp[x][y][d];
//   if(!BIT_ith(cond[d],0) && (L[d]==0 || x)) res += solve(x, if[R[d]==1,1,y], d-1);
//   if(!BIT_ith(cond[d],1) && (R[d]==1 || y)) res += solve(if[L[d]==0,1,x], y, d-1);
//   return dp[x][y][d] = res;
// }
// 
// {
//   rd(N,LL,RR,A(N));
//   rep(i,62) if(LL&(1LL<<i)) L[i] = 1;
//   rep(i,62) if(RR&(1LL<<i)) R[i] = 1;
//   doit(61, 0, N-1);
//   rep(i,2) rep(j,2) rep(k,62) dp[i][j][k] = -1;
//   wt(solve(0,0,61));
// }
0