Submission #1237890

#TimeUsernameProblemLanguageResultExecution timeMemory
1237890boxTwo Transportations (JOI19_transportations)C++20
0 / 100
153 ms1096 KiB
#include "Azer.h"
#include <bits/stdc++.h>
using namespace std;

#define sz(v) int(v.size())
typedef array<int, 2> ar2;
typedef vector<int> vi;

namespace {
const int N = 2000, A = 500, INF = N*A;
mt19937 rng(19260817);
int n;
int d[N];
bool marked[N];
vector<ar2> adj[N];
vector<bool> bits;
int last_d, i;
int state;
// 0: sent distance, waiting for response
// 1: got 1, waiting for distance and index
// 2: waiting for distance
// 3: sent 0, waiting for index

void spread(int i) {
	marked[i] = true;
	for (auto [j, c] : adj[i])
		d[j] = min(d[j], d[i]+c);
	last_d = d[i];
}
void init() {
	i = -1;
	for (int j = 0; j < n; j++) if (!marked[j] && (i == -1 || d[j] < d[i]))
		i = j;
	if (i == -1) return;

	if (rng()%2 == 0) {
		int v = min(A+1, d[i]-last_d);
		for (int j = 0; j < 8; j++) SendA(v>>j&1);
		state = 0;
	} else {
		state = 2;
	}
}
void process(bool b) {
	bits.push_back(b);
	if (state == 0) {
		assert(sz(bits) == 1);
		if (bits[0] == 1) {
			bits.clear();
			state = 1;
		} else {
			bits.clear();
			for (int j = 0; j < 11; j++) SendA(i>>j&1);
			spread(i);
			init();
		}
	} else if (state == 1) {
		if (sz(bits) == 8+11) {
			int v = 0;
			for (int j = 0; j < 8; j++) v += int(bits[j])<<j;
			i = 0;
			for (int j = 0; j < 11; j++) i += int(bits[8+j])<<j;
			bits.clear();
			d[i] = last_d+v;
			init();
		}
	} else if (state == 2) {
		if (sz(bits) == 8) {
			int v = 0;
			for (int j = 0; j < 8; j++) v += int(bits[j])<<j;
			bits.clear();
			if (d[i]-last_d < v) {
				SendA(1);
				v = d[i]-last_d;
				for (int j = 0; j < 8; j++) SendA(v>>j&1);
				for (int j = 0; j < 11; j++) SendA(i>>j&1);
				spread(i);
				init();
			} else {
				state = 3, last_d += v;
				SendA(0);
			}
		}
	} else if (state == 3) {
		if (sz(bits) == 11) {
			i = 0;
			for (int j = 0; j < 11; j++) i += int(bits[j])<<j;
			bits.clear();
			d[i] = last_d;
			spread(i);
			init();
		}
	}
}
}

void InitA(int n, int a, vi u, vi v, vi c) {
	::n = n;
	for (int i = 0; i < a; i++) {
		adj[u[i]].push_back({v[i], c[i]});
		adj[v[i]].push_back({u[i], c[i]});
	}
	fill(marked, marked+n, false);
	fill(d, d+n, INF);
	d[0] = 0;
	spread(0);
	init();
}

void ReceiveA(bool x) {
	process(x);
}

vi Answer() {
	return vi(d, d+n);
}
#include "Baijan.h"
#include <bits/stdc++.h>
using namespace std;

#define sz(v) int(v.size())
typedef array<int, 2> ar2;
typedef vector<int> vi;

namespace {
const int N = 2000, A = 500, INF = N*A;
mt19937 rng(19260817);
int n;
int d[N];
bool marked[N];
vector<ar2> adj[N];
vector<bool> bits;
int last_d, i;
int state;
// 0: sent distance, waiting for response
// 1: got 1, waiting for distance and index
// 2: waiting for distance
// 3: sent 0, waiting for index

void spread(int i) {
	marked[i] = true;
	for (auto [j, c] : adj[i])
		d[j] = min(d[j], d[i]+c);
	last_d = d[i];
}
void init() {
	i = -1;
	for (int j = 0; j < n; j++) if (!marked[j] && (i == -1 || d[j] < d[i]))
		i = j;
	if (i == -1) return;

	if (rng()%2 == 1) {
		int v = min(A+1, d[i]-last_d);
		for (int j = 0; j < 8; j++) SendB(v>>j&1);
		state = 0;
	} else {
		state = 2;
	}
}
void process(bool b) {
	bits.push_back(b);
	if (state == 0) {
		assert(sz(bits) == 1);
		if (bits[0] == 1) {
			bits.clear();
			state = 1;
		} else {
			bits.clear();
			for (int j = 0; j < 11; j++) SendB(i>>j&1);
			spread(i);
			init();
		}
	} else if (state == 1) {
		if (sz(bits) == 8+11) {
			int v = 0;
			for (int j = 0; j < 8; j++) v += int(bits[j])<<j;
			i = 0;
			for (int j = 0; j < 11; j++) i += int(bits[8+j])<<j;
			bits.clear();
			d[i] = last_d+v;
			init();
		}
	} else if (state == 2) {
		if (sz(bits) == 8) {
			int v = 0;
			for (int j = 0; j < 8; j++) v += int(bits[j])<<j;
			bits.clear();
			if (d[i]-last_d < v) {
				SendB(1);
				v = d[i]-last_d;
				for (int j = 0; j < 8; j++) SendB(v>>j&1);
				for (int j = 0; j < 11; j++) SendB(i>>j&1);
				spread(i);
				init();
			} else {
				state = 3, last_d += v;
				SendB(0);
			}
		}
	} else if (state == 3) {
		if (sz(bits) == 11) {
			i = 0;
			for (int j = 0; j < 11; j++) i += int(bits[j])<<j;
			bits.clear();
			d[i] = last_d;
			spread(i);
			init();
		}
	}
}
}

void InitB(int n, int a, vi u, vi v, vi c) {
	::n = n;
	for (int i = 0; i < a; i++) {
		adj[u[i]].push_back({v[i], c[i]});
		adj[v[i]].push_back({u[i], c[i]});
	}
	fill(marked, marked+n, false);
	fill(d, d+n, INF);
	d[0] = 0;
	spread(0);
	init();
}

void ReceiveB(bool x) {
	process(x);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...