#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
//mt19937 mrand(random_device{}());
const ll mod=1000000007;
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int gcd(int a,int b) { return b?gcd(b,a%b):a;}
// head
const int MAX_STR=25,N=2e3+5;
#define INF 0x3f3f3f3f
template<class T> inline void read(T &x) {
x=0; int c=getchar(),f=1;
for (;!isdigit(c);c=getchar()) if (c==45) f=-1;
for (;isdigit(c);c=getchar()) (x*=10)+=f*(c-'0');
}
void send_bit(int bit) {
printf("+ %d\n", bit);
fflush(stdout);
}
int read_bit() {
printf("?\n");
fflush(stdout);
char c;
scanf(" %c",&c);
return c-'0';
}
void send_int(int val,int bits) {
per(i,0,bits) send_bit((val>>i)&1);
}
int read_int(int bits) {
int val=0;
per(i,0,bits) val=(val<<1)|read_bit();
return val;
}
char person[MAX_STR];
vector<PII> e[N];
int dist_local[N],dist_global[N];
int main() {
if (scanf("%s",person)==EOF) return 0;
bool is_algosia=(strcmp(person,"Algosia")==0);
int n,m;
scanf("%d%d",&n,&m);
rep(i,0,m) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u--;
v--;
e[u].pb({v,w});
e[v].pb({u,w});
}
VI unvisited;
rep(i,1,n) unvisited.pb(i);
rep(i,0,n) dist_local[i]=INF,dist_global[i]=INF;
dist_global[0]=0;
for (const auto &[v,w]:e[0]) dist_local[v]=min(dist_local[v],w);
int curr_dist=0;
rep(step,1,n) {
int min_local=INF,min_local_idx=-1,k=SZ(unvisited);
rep(i,0,k) {
int v=unvisited[i];
if (dist_local[v]<min_local) {
min_local=dist_local[v];
min_local_idx=i;
}
}
int k_bits=0;
if (k>1) while ((1<<k_bits)<k) k_bits++;
int delta_local=min(511,max(0,min_local-curr_dist)),delta_global,min_global_idx;
if (is_algosia) {
send_int(delta_local,9);
int bajtek_wins=read_bit();
if (bajtek_wins) {
delta_global=read_int(9);
min_global_idx=read_int(k_bits);
} else {
delta_global=delta_local;
min_global_idx=min_local_idx;
send_int(min_global_idx,k_bits);
}
} else {
int delta_algosia=read_int(9);
if (delta_local<delta_algosia) {
send_bit(1);
send_int(delta_local,9);
delta_global=delta_local;
min_global_idx=min_local_idx;
send_int(min_global_idx,k_bits);
} else {
send_bit(0);
delta_global=delta_algosia;
min_global_idx=read_int(k_bits);
}
}
curr_dist+=delta_global;
int u=unvisited[min_global_idx];
dist_global[u]=curr_dist;
swap(unvisited[min_global_idx],unvisited.back());
unvisited.pop_back();
for (const auto &[v,w]:e[u]) dist_local[v]=min(dist_local[v],curr_dist+w);
}
if (is_algosia) {
printf("!");
rep(i,0,n) printf(" %d",dist_global[i]);
puts("");
fflush(stdout);
}
}
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 | #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; typedef double db; //mt19937 mrand(random_device{}()); const ll mod=1000000007; //int rnd(int x) { return mrand() % x;} ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} int gcd(int a,int b) { return b?gcd(b,a%b):a;} // head const int MAX_STR=25,N=2e3+5; #define INF 0x3f3f3f3f template<class T> inline void read(T &x) { x=0; int c=getchar(),f=1; for (;!isdigit(c);c=getchar()) if (c==45) f=-1; for (;isdigit(c);c=getchar()) (x*=10)+=f*(c-'0'); } void send_bit(int bit) { printf("+ %d\n", bit); fflush(stdout); } int read_bit() { printf("?\n"); fflush(stdout); char c; scanf(" %c",&c); return c-'0'; } void send_int(int val,int bits) { per(i,0,bits) send_bit((val>>i)&1); } int read_int(int bits) { int val=0; per(i,0,bits) val=(val<<1)|read_bit(); return val; } char person[MAX_STR]; vector<PII> e[N]; int dist_local[N],dist_global[N]; int main() { if (scanf("%s",person)==EOF) return 0; bool is_algosia=(strcmp(person,"Algosia")==0); int n,m; scanf("%d%d",&n,&m); rep(i,0,m) { int u,v,w; scanf("%d%d%d",&u,&v,&w); u--; v--; e[u].pb({v,w}); e[v].pb({u,w}); } VI unvisited; rep(i,1,n) unvisited.pb(i); rep(i,0,n) dist_local[i]=INF,dist_global[i]=INF; dist_global[0]=0; for (const auto &[v,w]:e[0]) dist_local[v]=min(dist_local[v],w); int curr_dist=0; rep(step,1,n) { int min_local=INF,min_local_idx=-1,k=SZ(unvisited); rep(i,0,k) { int v=unvisited[i]; if (dist_local[v]<min_local) { min_local=dist_local[v]; min_local_idx=i; } } int k_bits=0; if (k>1) while ((1<<k_bits)<k) k_bits++; int delta_local=min(511,max(0,min_local-curr_dist)),delta_global,min_global_idx; if (is_algosia) { send_int(delta_local,9); int bajtek_wins=read_bit(); if (bajtek_wins) { delta_global=read_int(9); min_global_idx=read_int(k_bits); } else { delta_global=delta_local; min_global_idx=min_local_idx; send_int(min_global_idx,k_bits); } } else { int delta_algosia=read_int(9); if (delta_local<delta_algosia) { send_bit(1); send_int(delta_local,9); delta_global=delta_local; min_global_idx=min_local_idx; send_int(min_global_idx,k_bits); } else { send_bit(0); delta_global=delta_algosia; min_global_idx=read_int(k_bits); } } curr_dist+=delta_global; int u=unvisited[min_global_idx]; dist_global[u]=curr_dist; swap(unvisited[min_global_idx],unvisited.back()); unvisited.pop_back(); for (const auto &[v,w]:e[u]) dist_local[v]=min(dist_local[v],curr_dist+w); } if (is_algosia) { printf("!"); rep(i,0,n) printf(" %d",dist_global[i]); puts(""); fflush(stdout); } } |
English