제출 #112232

#제출 시각아이디문제언어결과실행 시간메모리
112232aintaTwo Transportations (JOI19_transportations)C++17
100 / 100
2132 ms110832 KiB
#include "Azer.h"
#include <vector>
#include <algorithm>

namespace AAA{
	int N, r1 = 0, r2 = 0;
	int w[2010][2010], D[2010], vis[2010];
	int count = 0, bef = 0, ccc = 0, cur = 0, cpv = 0;
	void Make(int num, int x) {
		if (num == 9)ccc++;
		int i;
		for (i = 0; i < num; i++) {
			SendA((x >> i) & 1);
		}
	}
	void Calc() {
		int i, Mn = 1e8, pv = -1, diff;
		for (i = 0; i < N; i++) {
			if (Mn > D[i] && !vis[i]) {
				Mn = D[i], pv = i;
			}
		}
		cur = Mn;
		cpv = pv;
		if (pv == -1) diff = 511, pv = 2047;
	}

	void receive(bool x) {
		int tt = x;
		count++;
		if (count <= 9) {
			r2 += (tt << (count-1));
		}
		if (count == 9) {
			Calc();
			if (bef + r2 >= cur) {
				Make(11, cpv);
				vis[cpv] = 1;
				count = 0;
				bef = cur;
				r1 = r2 = 0;
				if (ccc >= N)return;
				for (int i = 0; i < N; i++) {
					D[i] = std::min(D[i], D[cpv] + w[cpv][i]);
				}
				Calc();
				Make(9, std::min(cur - bef,511));
				return;
			}
		}
		if (count <= 9)return;
		r1 += (tt << (count - 10));
		if (count == 20) {
			D[r1] = std::min(D[r1], bef + r2);
			vis[r1] = 1;

			for (int i = 0; i < N; i++) {
				D[i] = std::min(D[i], D[r1] + w[r1][i]);
			}

			bef = bef + r2;
			count = 0;
			r1 = r2 = 0;
			if (ccc >= N)return;
			Calc();
			Make(9, std::min(cur - bef, 511));
			return;
		}
	}

	void init(int n, int A, std::vector<int> U, std::vector<int> V,
		std::vector<int> C) {

		N = n;
		for (int i = 0; i < N; i++) {
			D[i] = 1e9;
			vis[i] = 0;
			for (int j = 0; j < N; j++) {
				if (i != j)w[i][j] = 1e9;
				else w[i][j] = 0;
			}
		}
		D[0] = 0;
		for (int i = 0; i < U.size(); i++) {
			w[U[i]][V[i]] = std::min(w[U[i]][V[i]], C[i]);
			w[V[i]][U[i]] = std::min(w[V[i]][U[i]], C[i]);
		}
		Calc();
		Make(9, cur);
	}

	std::vector<int> answer() {
		std::vector<int> ans(N);
		for (int k = 0; k < N; ++k) {
			ans[k] = D[k];
		}
		return ans;
	}

}; // namespace

void InitA(int N, int A, std::vector<int> U, std::vector<int> V,
           std::vector<int> C) {

	AAA::init(N, A, U, V, C);
}

void ReceiveA(bool x) {
	AAA::receive(x);
}

std::vector<int> Answer() {
	return AAA::answer();
}
#include "Baijan.h"
#include <vector>
#include <algorithm>

namespace BBB{

	int N, r1 = 0, r2 = 0;
	int w[2010][2010], D[2010], vis[2010];
	int count = 0, bef = 0, ccc = 0, cur = 0, cpv = 0;
	void Make(int num, int x) {
		if (num == 9)ccc++;
		int i;
		for (i = 0; i < num; i++) {
			SendB((x >> i) & 1);
		}
	}
	void Calc() {
		int i, Mn = 1e8, pv = -1, diff;
		for (i = 0; i < N; i++) {
			if (Mn > D[i] && !vis[i]) {
				Mn = D[i], pv = i;
			}
		}
		cur = Mn;
		cpv = pv;
		if (pv == -1) diff = 511, pv = 2047;
	}

	void receive(bool y) {
		int tt = y;
		count++;
		if (count <= 9) {
			r2 += (tt << (count-1));
		}
		if (count == 9) {
			Calc();
			if (bef + r2 > cur) {
				Make(11, cpv);
				vis[cpv] = 1;
				count = 0;
				bef = cur;
				r1 = r2 = 0;
				if (ccc >= N)return;
				for (int i = 0; i < N; i++) {
					D[i] = std::min(D[i], D[cpv] + w[cpv][i]);
				}
				Calc();
				Make(9, std::min(cur - bef, 511));
				return;
			}
		}
		if (count <= 9)return;
		r1 += (tt << (count - 10));
		if (count == 20) {
			D[r1] = std::min(D[r1], bef + r2);
			vis[r1] = 1;

			for (int i = 0; i < N; i++) {
				D[i] = std::min(D[i], D[r1] + w[r1][i]);
			}

			bef = bef + r2;
			count = 0;
			r1 = r2 = 0;
			if (ccc >= N)return;
			Calc();
			Make(9, std::min(cur - bef,511));
			return;
		}
	}


	void init(int n, int A, std::vector<int> U, std::vector<int> V,
		std::vector<int> C) {

		N = n;
		for (int i = 0; i < N; i++) {
			D[i] = 1e9;
			vis[i] = 0;
			for (int j = 0; j < N; j++) {
				if (i != j)w[i][j] = 1e9;
				else w[i][j] = 0;
			}
		}
		D[0] = 0;
		for (int i = 0; i < U.size(); i++) {
			w[U[i]][V[i]] = std::min(w[U[i]][V[i]], C[i]);
			w[V[i]][U[i]] = std::min(w[V[i]][U[i]], C[i]);
		}
		Calc();
		Make(9, cur);
	}
}  // namespace

void InitB(int N, int B, std::vector<int> S, std::vector<int> T,
           std::vector<int> D) {
	BBB::init(N, B, S, T, D);
}

void ReceiveB(bool y) {
	BBB::receive(y);
}

컴파일 시 표준 에러 (stderr) 메시지

Azer.cpp: In function 'void AAA::Calc()':
Azer.cpp:17:29: warning: variable 'diff' set but not used [-Wunused-but-set-variable]
   int i, Mn = 1e8, pv = -1, diff;
                             ^~~~
Azer.cpp: In function 'void AAA::init(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
Azer.cpp:84:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < U.size(); i++) {
                   ~~^~~~~~~~~~

Baijan.cpp: In function 'void BBB::Calc()':
Baijan.cpp:18:29: warning: variable 'diff' set but not used [-Wunused-but-set-variable]
   int i, Mn = 1e8, pv = -1, diff;
                             ^~~~
Baijan.cpp: In function 'void BBB::init(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
Baijan.cpp:86:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < U.size(); i++) {
                   ~~^~~~~~~~~~
#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...