Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33833 23级逯一鸣 【S】T1 C++ 通过 100 82 MS 276 KB 1874 2024-10-23 09:35:45

Tests(10/10):


#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() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t; cin >> t; while (t-- > 0) { i64 A, B; cin >> A >> B; if (A == B) { cout << "1\n"; continue; } 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 < (int)X.size(); ++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; }


测评信息: