shinka-backup / docker_space /frontier_cs_7 /examples /deepseekreasoner_1.cpp
JustinTX's picture
Add files using upload-large-folder tool
1fd0050 verified
#include <bits/stdc++.h>
using namespace std;
struct State {
int i, low, high;
bool operator<(const State& other) const {
if (i != other.i) return i < other.i;
if (low != other.low) return low < other.low;
return high < other.high;
}
};
int main() {
int L, R;
cin >> L >> R;
auto get_bin = [](int x) -> vector<int> {
vector<int> res;
while (x > 0) {
res.push_back(x % 2);
x /= 2;
}
reverse(res.begin(), res.end());
return res;
};
vector<int> L_bin = get_bin(L);
vector<int> R_bin = get_bin(R);
int lenL = L_bin.size();
int lenR = R_bin.size();
vector<vector<vector<bool>>> productive(lenR, vector<vector<bool>>(2, vector<bool>(2, false)));
for (int i = lenR - 1; i >= 0; --i) {
for (int low = 0; low <= 1; ++low) {
for (int high = 0; high <= 1; ++high) {
for (int b = 0; b <= 1; ++b) {
bool ok = true;
if (low == 1 && i < lenL && b < L_bin[i]) ok = false;
if (high == 1 && i < lenR && b > R_bin[i]) ok = false;
if (!ok) continue;
if (i + 1 >= lenL && i + 1 <= lenR) productive[i][low][high] = true;
if (i + 1 < lenR) {
int new_low = (low && i < lenL && b == L_bin[i]) ? 1 : 0;
int new_high = (high && i < lenR && b == R_bin[i]) ? 1 : 0;
if (productive[i + 1][new_low][new_high])
productive[i][low][high] = true;
}
}
}
}
}
map<State, int> idMap;
vector<vector<pair<int, int>>> edges(1);
int next_id = 1;
State start{0, 1, 1};
idMap[start] = next_id++;
edges.push_back({});
queue<State> q;
q.push(start);
while (!q.empty()) {
State s = q.front(); q.pop();
int u = idMap[s];
for (int b = 0; b <= 1; ++b) {
if (s.low == 1 && s.i < lenL && b < L_bin[s.i]) continue;
if (s.high == 1 && s.i < lenR && b > R_bin[s.i]) continue;
if (s.i + 1 >= lenL && s.i + 1 <= lenR)
edges[u].push_back({0, b});
if (s.i + 1 < lenR) {
int new_low = (s.low && s.i < lenL && b == L_bin[s.i]) ? 1 : 0;
int new_high = (s.high && s.i < lenR && b == R_bin[s.i]) ? 1 : 0;
if (productive[s.i + 1][new_low][new_high]) {
State ns{s.i + 1, new_low, new_high};
if (!idMap.count(ns)) {
idMap[ns] = next_id++;
edges.push_back({});
q.push(ns);
}
int v = idMap[ns];
edges[u].push_back({v, b});
}
}
}
}
int state_count = idMap.size();
int T_id = state_count + 1;
int n = T_id;
cout << n << "\n";
for (int u = 1; u <= state_count; ++u) {
cout << edges[u].size();
for (auto& e : edges[u]) {
int to = e.first, w = e.second;
if (to == 0) to = T_id;
cout << " " << to << " " << w;
}
cout << "\n";
}
cout << "0\n";
return 0;
}