#include <bits/stdc++.h>
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
using namespace std;
ostream *ferr;
#ifdef LOCAL
template<typename A, typename B>
auto&operator<<(auto&o,pair<A, B>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<&","[!i++]<<e;return o<<"}";}
#define debug(X...)(*ferr)<<"["#X"]: ",[](auto...$){(((*ferr)<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif
using i64 = long long;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<i64, i64>;
using vi = vector<int>;
using vll = vector<i64>;
const int INF = 1e9;
const int WEIGHT_BITS = 9;
const int MAX_WEIGHT = 510;
const int VERTEX_BITS = 11;
void SendInt(i64 val, int nbits) {
for (int i = 0; i < nbits; ++i) {
cout << "+ " << ((val >> i) & 1) << "\n";
}
cout << flush;
}
i64 ReadInt(int nbits) {
i64 ans = 0;
for (int i = 0; i < nbits; ++i) {
cout << "?" << endl;
i64 bit;
cin >> bit;
ans |= (bit << i);
}
return ans;
}
int main() {
ios_base::sync_with_stdio(0);
// cin.tie(0);
cout << fixed << setprecision(14);
cerr << fixed << setprecision(6);
string agent;
cin >> agent;
const bool is_bajtek = (agent == "Bajtek");
#ifdef LOCAL
ferr = new ofstream(is_bajtek ? "b.err" : "a.err");
#else
ferr = &cerr;
#endif
int n, m;
cin >> n >> m;
vector<vector<pii>> graph(n + 1);
for (int i = 0; i < m; ++i) {
int u, v, c;
cin >> u >> v >> c;
graph[u].emplace_back(v, c);
graph[v].emplace_back(u, c);
assert(0 <= c && c < (1 << WEIGHT_BITS));
}
vector<int> dist(n + 1, INF);
vector<bool> visited(n + 1);
dist[1] = 0;
int last_dist = 0;
priority_queue<pii> Q;
auto VisitVertex = [&](int vtx) {
debug(is_bajtek, vtx, dist[vtx]);
visited[vtx] = true;
last_dist = dist[vtx];
for (auto [s, c] : graph[vtx]) {
const int new_dist = dist[vtx] + c;
if (new_dist < dist[s]) {
dist[s] = new_dist;
Q.emplace(pii{-dist[s], s});
}
}
};
VisitVertex(1);
for (int time_step = 0; time_step < n - 1; ++time_step) {
while (!Q.empty() && visited[Q.top().second]) {
Q.pop();
}
const int my_best_dist = Q.empty() ? (last_dist + MAX_WEIGHT) : (-Q.top().first);
assert(my_best_dist >= last_dist);
const int my_delta = my_best_dist - last_dist;
SendInt(my_delta, WEIGHT_BITS);
const int friend_delta = ReadInt(WEIGHT_BITS);
const bool do_i_win = (my_delta < friend_delta) || (my_delta == friend_delta && is_bajtek);
debug(is_bajtek, my_delta, friend_delta);
if (do_i_win) {
const int vtx = Q.top().second;
SendInt(vtx, VERTEX_BITS);
VisitVertex(vtx);
} else {
const int vtx = ReadInt(VERTEX_BITS);
const int friend_best_dist = last_dist + friend_delta;
dist[vtx] = friend_best_dist;
VisitVertex(vtx);
}
}
if (!is_bajtek) {
cout << "!";
for (int vtx = 1; vtx <= n; ++vtx) {
cout << " " << dist[vtx];
}
cout << endl;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include <bits/stdc++.h> #define ALL(x) (x).begin(), (x).end() #define SZ(x) ((int)(x).size()) using namespace std; ostream *ferr; #ifdef LOCAL template<typename A, typename B> auto&operator<<(auto&o,pair<A, B>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<&","[!i++]<<e;return o<<"}";} #define debug(X...)(*ferr)<<"["#X"]: ",[](auto...$){(((*ferr)<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif using i64 = long long; using ll = long long; using pii = pair<int, int>; using pll = pair<i64, i64>; using vi = vector<int>; using vll = vector<i64>; const int INF = 1e9; const int WEIGHT_BITS = 9; const int MAX_WEIGHT = 510; const int VERTEX_BITS = 11; void SendInt(i64 val, int nbits) { for (int i = 0; i < nbits; ++i) { cout << "+ " << ((val >> i) & 1) << "\n"; } cout << flush; } i64 ReadInt(int nbits) { i64 ans = 0; for (int i = 0; i < nbits; ++i) { cout << "?" << endl; i64 bit; cin >> bit; ans |= (bit << i); } return ans; } int main() { ios_base::sync_with_stdio(0); // cin.tie(0); cout << fixed << setprecision(14); cerr << fixed << setprecision(6); string agent; cin >> agent; const bool is_bajtek = (agent == "Bajtek"); #ifdef LOCAL ferr = new ofstream(is_bajtek ? "b.err" : "a.err"); #else ferr = &cerr; #endif int n, m; cin >> n >> m; vector<vector<pii>> graph(n + 1); for (int i = 0; i < m; ++i) { int u, v, c; cin >> u >> v >> c; graph[u].emplace_back(v, c); graph[v].emplace_back(u, c); assert(0 <= c && c < (1 << WEIGHT_BITS)); } vector<int> dist(n + 1, INF); vector<bool> visited(n + 1); dist[1] = 0; int last_dist = 0; priority_queue<pii> Q; auto VisitVertex = [&](int vtx) { debug(is_bajtek, vtx, dist[vtx]); visited[vtx] = true; last_dist = dist[vtx]; for (auto [s, c] : graph[vtx]) { const int new_dist = dist[vtx] + c; if (new_dist < dist[s]) { dist[s] = new_dist; Q.emplace(pii{-dist[s], s}); } } }; VisitVertex(1); for (int time_step = 0; time_step < n - 1; ++time_step) { while (!Q.empty() && visited[Q.top().second]) { Q.pop(); } const int my_best_dist = Q.empty() ? (last_dist + MAX_WEIGHT) : (-Q.top().first); assert(my_best_dist >= last_dist); const int my_delta = my_best_dist - last_dist; SendInt(my_delta, WEIGHT_BITS); const int friend_delta = ReadInt(WEIGHT_BITS); const bool do_i_win = (my_delta < friend_delta) || (my_delta == friend_delta && is_bajtek); debug(is_bajtek, my_delta, friend_delta); if (do_i_win) { const int vtx = Q.top().second; SendInt(vtx, VERTEX_BITS); VisitVertex(vtx); } else { const int vtx = ReadInt(VERTEX_BITS); const int friend_best_dist = last_dist + friend_delta; dist[vtx] = friend_best_dist; VisitVertex(vtx); } } if (!is_bajtek) { cout << "!"; for (int vtx = 1; vtx <= n; ++vtx) { cout << " " << dist[vtx]; } cout << endl; } } |
English