Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33826 | 23级逯一鸣 | 【S】T1 | C++ | 编译错误 | 0 | 0 MS | 0 KB | 1613 | 2024-10-23 09:30:36 |
#include <algorithm> #include <iostream> #include <iterator> #include <utility> #include <vector> using namespace std; using i64 = long long; using Interval = pair<i64, i64>; vector<Interval> get_union(vector<Interval> P) { int n = P.size(); sort(P.begin(), P.end()); vector<bool> merged(n, false); for (int i = 0; i < n - 1; ++i) { for (int j = i + 1; j < n; ++j) { if (!merged[j] && P[i].second >= P[j].first) { merged[j] = true; P[i].second = max(P[i].second, P[j].second); } } } vector<Interval> res; for (int i = 0; i < n; ++i) { if (!merged[i]) res.emplace_back(P[i]); } return res; } inline i64 size(const Interval& P) { return P.second - P.first + 1; } int main() { i64 A, B; cin >> A >> B; if (A == B) { cout << "1\n"; return 0; } i64 a = A, b = B, T = 0; for (i64 t = 1; a > 0 || b > 0; a >>= 1, b >>= 1, t <<= 1) { if ((a & 1) != (b & 1)) T = t; } A &= (T << 1) - 1; B &= (T << 1) - 1; vector<Interval> X = { { A, T - 1 }, { T, B }, { T + A, (T << 1) - 1 } }; for (i64 k = 1; T + k <= B; k <<= 1) X[1].second = T + (k << 1) - 1; for (int i = 0; i < ssize(X); ++i) { if (size(X[i]) <= 0) X.erase(X.begin() + i--); } auto res(get_union(X)); i64 len = 0; for (const auto& each : res) len += size(each); cout << len << '\n'; return 0; }