#include <iostream>
#include <vector>
#include <queue>
#include <cassert>
#define pii pair<int, int>
using namespace std;
int n, m, dist[2005];
bool iguess;
vector<pii> g[2005];
void send_number(int num, int bits){
assert(num >= 0);
for (int i = 0; i < bits; i++){
cout << "+ " << num % 2 << endl;
num /= 2;
}
}
int read_number(int bits){
int num = 0, mn = 1;
for (int i = 0; i < bits; i++){
cout << '?' << endl;
bool bit;
cin >> bit;
num += bit * mn;
mn *= 2;
}
return num;
}
int main(){
string whoami;
cin >> whoami;
iguess = (whoami[0] == 'A');
cin >> n >> m;
for (int i = 0; i < m; i++){
int u, v, c;
cin >> u >> v >> c;
g[u].push_back({c, v});
g[v].push_back({c, u});
}
for (int i = 2; i <= n; i++)
dist[i] = -1;
dist[1] = 0;
priority_queue<pii, vector<pii>, greater<pii>> q;
for (auto el: g[1])
q.push(el);
int last_dist = 0;
for (int i = 0; i < n - 1; i++){
while (!q.empty() && dist[q.top().second] != -1)
q.pop();
int my_dist = (q.empty()?511:q.top().first - last_dist);
send_number(my_dist, 9);
int his_dist = read_number(9), node, dis;
if (my_dist < his_dist || (my_dist == his_dist && iguess)){
node = q.top().second;
dis = my_dist;
q.pop();
send_number(node, 11);
}
else {
node = read_number(11);
dis = his_dist;
}
dis += last_dist;
dist[node] = dis;
last_dist = dis;
for (auto el: g[node])
q.push({el.first + dis, el.second});
}
if (!iguess)
return 0;
cout << "! ";
for (int i = 1; i <= n; i++){
cout << dist[i] << ' ';
}
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 | #include <iostream> #include <vector> #include <queue> #include <cassert> #define pii pair<int, int> using namespace std; int n, m, dist[2005]; bool iguess; vector<pii> g[2005]; void send_number(int num, int bits){ assert(num >= 0); for (int i = 0; i < bits; i++){ cout << "+ " << num % 2 << endl; num /= 2; } } int read_number(int bits){ int num = 0, mn = 1; for (int i = 0; i < bits; i++){ cout << '?' << endl; bool bit; cin >> bit; num += bit * mn; mn *= 2; } return num; } int main(){ string whoami; cin >> whoami; iguess = (whoami[0] == 'A'); cin >> n >> m; for (int i = 0; i < m; i++){ int u, v, c; cin >> u >> v >> c; g[u].push_back({c, v}); g[v].push_back({c, u}); } for (int i = 2; i <= n; i++) dist[i] = -1; dist[1] = 0; priority_queue<pii, vector<pii>, greater<pii>> q; for (auto el: g[1]) q.push(el); int last_dist = 0; for (int i = 0; i < n - 1; i++){ while (!q.empty() && dist[q.top().second] != -1) q.pop(); int my_dist = (q.empty()?511:q.top().first - last_dist); send_number(my_dist, 9); int his_dist = read_number(9), node, dis; if (my_dist < his_dist || (my_dist == his_dist && iguess)){ node = q.top().second; dis = my_dist; q.pop(); send_number(node, 11); } else { node = read_number(11); dis = his_dist; } dis += last_dist; dist[node] = dis; last_dist = dis; for (auto el: g[node]) q.push({el.first + dis, el.second}); } if (!iguess) return 0; cout << "! "; for (int i = 1; i <= n; i++){ cout << dist[i] << ' '; } cout << endl; } |
English