제출 #1354511

#제출 시각아이디문제언어결과실행 시간메모리
1354511Jawad_Akbar_JJTwo Transportations (JOI19_transportations)C++20
0 / 100
73 ms8728 KiB
#include <iostream>
#include <vector>
#include <set>
#include "Azer.h"
#include "Baijan.h"

using namespace std;
const int MA = 1<<12;
vector<pair<int, int>> neiA[MA];
vector<int> v1A, v2A, v3A, inpA, Final;
int Na, A, typeA, inpSA, szA, KA, numA;

void Asends(int val){
	for (int i=10;i+1;i--){
		SendA(!!(val & (1<<i)));
	}
}

void InitA(int n, int a, vector<int> u, vector<int> v, vector<int> c){
	Na = n,A = a;
	v1A = u, v2A = v, v3A = c;


	if (A <= 300){
		typeA = 1;
		Asends(1);
		Asends(A * 3);
		for (int i=0;i<A;i++)
			Asends(u[i]), Asends(v[i]), Asends(c[i]);
	}
	else{
		typeA = 2;
		Asends(2);
		Asends(0);
	}

}

vector<int> dikstraA(){
	vector<int> Ans(Na, 1e9);
	Ans[0] = 0;

	set<pair<int, int>> st = {{0, 0}};
	while (st.size() > 0){
		auto [mn, u] = *begin(st);
		st.erase(begin(st));

		if (mn != Ans[u])
			continue;
		for (auto [i, w] : neiA[u]){
			if (Ans[i] > Ans[u] + w){
				Ans[i] = Ans[u] + w;
				st.insert({Ans[i], i});
			}
		}
	}
	return Ans;
}

void prepareAns(){
	if (typeA == 1){
		for (int i=0;i<Na+Na;i+=2)
			Final.push_back((inpA[i]<<11) + inpA[i+1]);
		return;
	}
	for (int i=0;i<A;i++){
		neiA[v1A[i]].push_back({v2A[i], v3A[i]});
		neiA[v2A[i]].push_back({v1A[i], v3A[i]});
	}
	for (int i=0;i<inpSA;i+=3){
		neiA[inpA[i]].push_back({inpA[i+1], inpA[i+2]});
		neiA[inpA[i+1]].push_back({inpA[i], inpA[i+2]});
	}

	Final = dikstraA();
}


void ReceiveA(bool b){
	numA = numA * 2 + b, szA++;
	if (szA == 11){
		KA++;
		if (KA == 1)
			inpSA = numA;
		if (KA > 1)
			inpA.push_back(numA);
		numA = 0, szA = 0;

		if (KA >= 1 and KA == inpSA + 1)
			prepareAns();
	}
}

vector<int> Answer(){
	return Final;
}
#include <iostream>
#include <vector>
#include <set>
#include "Azer.h"
#include "Baijan.h"


using namespace std;
const int M = 1<<12;
vector<pair<int, int>> nei[M];
vector<int> v1, v2, v3, inp;
int N, B, type, inpS, sz, K, num;

void Bsends(int val){
	for (int i=10;i+1;i--){
		SendB(!!(val & (1<<i)));
	}
}

void InitB(int n, int b, vector<int> u, vector<int> v, vector<int> c){
	N = n, B = b;
	v1 = u, v2 = v, v3 = c;
}

vector<int> dikstra(){
	vector<int> Ans(N, 1e9);
	Ans[0] = 0;

	set<pair<int, int>> st = {{0, 0}};
	while (st.size() > 0){
		auto [mn, u] = *begin(st);
		st.erase(begin(st));

		if (mn != Ans[u])
			continue;
		for (auto [i, w] : nei[u]){
			if (Ans[i] > Ans[u] + w){
				Ans[i] = Ans[u] + w;
				st.insert({Ans[i], i});
			}
		}
	}
	return Ans;
}

void prepareAnsA(){
	if (type == 2){
		Bsends(B * 3);
		for (int i=0;i<B;i++)
			Bsends(v1[i]), Bsends(v2[i]), Bsends(v3[i]);
		return;
	}
	for (int i=0;i<B;i++){
		nei[v1[i]].push_back({v2[i], v3[i]});
		nei[v2[i]].push_back({v1[i], v3[i]});
	}
	for (int i=0;i<inpS;i+=3){
		nei[inp[i]].push_back({inp[i+1], inp[i+2]});
		nei[inp[i+1]].push_back({inp[i], inp[i+2]});
	}

	vector<int> Ans = dikstra();
	
	Bsends(N * 2);
	for (int i : Ans){
		Bsends((4192256 & i)>>11);
		Bsends(2047 & i);
	}
	return;
}

void ReceiveB(bool b){
	num = num * 2 + b, sz++;
	if (sz == 11){
		K++;
		if (K == 1){
			type = num;
		}
		if (K == 2)
			inpS = num;
		if (K > 2)
			inp.push_back(num);
		num = 0, sz = 0;

		if (K >= 2 and K == inpS + 2)
			prepareAnsA();
	}
}
#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...