結果
| 問題 |
No.911 ラッキーソート
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-08-04 18:45:16 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 789 ms / 2,000 ms |
| コード長 | 2,141 bytes |
| コンパイル時間 | 1,161 ms |
| コンパイル使用メモリ | 93,228 KB |
| 最終ジャッジ日時 | 2025-01-12 14:23:02 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 46 |
ソースコード
#include <iostream>
#include <vector>
#include <functional>
template <class It>
std::vector<std::pair<typename It::value_type, int>> runlength(
It begin, It end) {
using T = typename It::value_type;
std::vector<std::pair<T, int>> res;
while (begin != end) {
const T& c = *(begin++);
if (res.empty() || c != res.back().first) {
res.emplace_back(c, 1);
} else {
++res.back().second;
}
}
return res;
}
constexpr int K = 61;
using lint = long long;
void solve() {
int n;
lint xl, xr;
std::cin >> n >> xl >> xr;
std::vector<lint> xs(n);
for (auto& x : xs) std::cin >> x;
std::vector<int> ts(K, 3);
std::function<void(int, int, int)> dfs =
[&](int l, int r, int k) -> void {
if (k < 0) return;
std::vector<int> bs;
for (int i = l; i < r; ++i) {
bs.push_back((xs[i] >> k) & 1);
}
auto ps = runlength(bs.begin(), bs.end());
int t;
if (ps.size() == 1) {
t = 3;
} else if (ps.size() == 2) {
t = 1 << bs[0];
} else {
t = 0;
}
ts[k] &= t;
if (ps.size() == 1) {
dfs(l, r, k - 1);
} else if (ps.size() == 2) {
int m = l + ps.front().second;
dfs(l, m, k - 1);
dfs(m, r, k - 1);
}
};
dfs(0, n, K - 1);
auto calc = [&](lint m) -> lint {
if (m < 0) return 0;
std::vector<lint> dp(2, 1);
auto ndp = dp;
for (int k = 0; k < K; ++k) {
std::fill(ndp.begin(), ndp.end(), 0);
for (int d = 0; d < 2; ++d) {
if (((ts[k] >> d) & 1) == 0) continue;
ndp[0] += dp[0];
if (d < ((m >> k) & 1)) ndp[1] += dp[0];
if (d == ((m >> k) & 1)) ndp[1] += dp[1];
}
std::swap(dp, ndp);
}
return dp[1];
};
std::cout << calc(xr) - calc(xl - 1) << "\n";
}
int main() {
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
solve();
return 0;
}