結果
| 問題 |
No.911 ラッキーソート
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-10-18 23:26:24 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 430 ms / 2,000 ms |
| コード長 | 3,890 bytes |
| コンパイル時間 | 2,372 ms |
| コンパイル使用メモリ | 209,916 KB |
| 最終ジャッジ日時 | 2025-01-07 23:53:03 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 46 |
ソースコード
#include <bits/stdc++.h>
#define LLI long long int
#define FOR(v, a, b) for(LLI v = (a); v < (b); ++v)
#define FORE(v, a, b) for(LLI v = (a); v <= (b); ++v)
#define REP(v, n) FOR(v, 0, n)
#define REPE(v, n) FORE(v, 0, n)
#define REV(v, a, b) for(LLI v = (a); v >= (b); --v)
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define ITR(it, c) for(auto it = (c).begin(); it != (c).end(); ++it)
#define RITR(it, c) for(auto it = (c).rbegin(); it != (c).rend(); ++it)
#define EXIST(c,x) ((c).find(x) != (c).end())
#define fst first
#define snd second
#define popcount __builtin_popcount
#define UNIQ(v) (v).erase(unique(ALL(v)), (v).end())
#define bit(i) (1LL<<(i))
#ifdef DEBUG
#include <misc/C++/Debug.cpp>
#else
#define dump(...) ((void)0)
#endif
#define gcd __gcd
using namespace std;
template <class T> constexpr T lcm(T m, T n){return m/gcd(m,n)*n;}
template <typename I> void join(ostream &ost, I s, I t, string d=" "){for(auto i=s; i!=t; ++i){if(i!=s)ost<<d; ost<<*i;}ost<<endl;}
template <typename T> istream& operator>>(istream &is, vector<T> &v){for(auto &a : v) is >> a; return is;}
template <typename T, typename U> bool chmin(T &a, const U &b){return (a>b ? a=b, true : false);}
template <typename T, typename U> bool chmax(T &a, const U &b){return (a<b ? a=b, true : false);}
template <typename T, size_t N, typename U> void fill_array(T (&a)[N], const U &v){fill((U*)a, (U*)(a+N), v);}
struct Init{
Init(){
cin.tie(0);
ios::sync_with_stdio(false);
}
}init;
template <int N>
string bin_to_str(LLI val){
stringstream ss;
ss << bitset<N>(val);
return ss.str();
}
// dp[digit number][x > L][x < R]
LLI dp[64][2][2];
LLI solve(int N, LLI L, LLI R, vector<LLI> A){
vector<bool> pattern_0(61), pattern_1(61), pattern_both(61);
REP(i,N){
dump(bitset<30>(A[i]));
}
vector<vector<int>> sep(62);
sep[61] = {N};
REV(i,60,0){
auto &s = sep[i+1];
//dump(s);
int cur = 0;
int inc = 0, dec = 0;
for(auto t : s){
vector<int> temp;
FOR(j,cur,t){
temp.push_back((A[j] >> i) & 1);
}
//dump(temp);
int zero = count(ALL(temp), 0);
int one = temp.size() - zero;
if(zero == 0 or zero == (int)temp.size()){ // all same
}else{
if(count(temp.begin(), temp.begin()+zero, 0) == zero){ // increasing
inc += 1;
sep[i].push_back(cur+zero);
}else if(count(temp.begin(), temp.begin()+one, 1) == one){ // decreasing
dec += 1;
sep[i].push_back(cur+one);
}else{
return 0;
}
}
sep[i].push_back(t);
cur = t;
}
if(inc and dec) return 0;
if(inc){
pattern_0[i] = true;
}else if(dec){
pattern_1[i] = true;
}else{
pattern_both[i] = true;
}
}
fill_array(dp, 0);
dp[0][0][0] = 1;
string l = bin_to_str<61>(L);
string r = bin_to_str<61>(R);
dump(l,r);
REPE(i,60){
REP(j,2){
REP(k,2){
if(pattern_0[60-i] or pattern_both[60-i]){
if(j or l[i] == '0'){
dp[i+1][j][r[i] == '1' or k] += dp[i][j][k];
}
}
if(pattern_1[60-i] or pattern_both[60-i]){
if(k or r[i] == '1'){
dp[i+1][l[i] == '0' or j][k] += dp[i][j][k];
}
}
}
}
}
REP(i,61){
int k = 0;
if(pattern_0[i]) k += 1;
if(pattern_1[i]) k += 2;
if(pattern_both[i]) k += 4;
cerr << k << " ";
}
cerr << endl;
REP(j,2){
REP(k,2){
REPE(i,61){
cerr << dp[i][j][k] << " ";
}
cerr << endl;
}
cerr << endl;
}
LLI ret = 0;
REP(j,2){
REP(k,2){
ret += dp[61][j][k];
}
}
return ret;
}
int main(){
LLI N,L,R;
while(cin >> N >> L >> R){
vector<LLI> A(N); cin >> A;
cout << solve(N,L,R,A) << endl;
}
return 0;
}