結果
問題 | No.911 ラッキーソート |
ユーザー |
![]() |
提出日時 | 2019-10-18 22:07:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 87 ms / 2,000 ms |
コード長 | 5,305 bytes |
コンパイル時間 | 2,623 ms |
コンパイル使用メモリ | 212,576 KB |
最終ジャッジ日時 | 2025-01-07 22:55:36 |
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 46 |
ソースコード
#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){int sx;int sy;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)){sy = y;if(R[d]==1){sy = 1;}res += solve(x, sy, d-1);}if(!((cond[d]) &(1<<(1)))&& (R[d]==1 || y)){sx = x;if(L[d]==0){sx = 1;}res += solve(sx, y, d-1);}return dp[x][y][d] = res;}int main(){int i;int k;int mn0;int mx0;int mn1;int mx1;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++){for(k=(0);k<(62);k++){dp[i][j][k] = -1;}}}wt_L(solve(0,0,61));wt_L('\n');return 0;}// cLay varsion 20191012-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){// int sx, sy;// 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)){// sy = y;// if(R[d]==1) sy = 1;// res += solve(x, sy, d-1);// }// if(!BIT_ith(cond[d],1) && (R[d]==1 || y)){// sx = x;// if(L[d]==0) sx = 1;// res += solve(sx, y, d-1);// }// return dp[x][y][d] = res;// }//// {// int k, mn0, mx0, mn1, mx1;// 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));// }