Submission #1354870

#TimeUsernameProblemLanguageResultExecution timeMemory
1354870Jawad_Akbar_JJTwo Transportations (JOI19_transportations)C++20
100 / 100
232 ms48936 KiB
#include "Azer.h"
// #include <iostream>
#include <vector>
#include <set>

using namespace std;

namespace {
	const int M = 1<<11;
	vector<pair<int, int>> nei[M];
	vector<int> Ans;
	set<pair<int, int>> st;
	int L, K, num, Last, cnt = 0;
	pair<int, int> Nxt;
}

void Asends(int v, int k){
	for (int i=k-1;i+1;i--)
		SendA(!!(v & (1<<i)));
}

pair<int, int> getMinA(){
	auto [mn, u] = *begin(st);
	if (mn == Ans[u])
		return {mn, u};
	st.erase(begin(st));
	return getMinA();
}

void relaxA(int mn, int u){
	Last = mn, cnt ++;
	st.erase({mn, u});
	Ans[u] = mn;
	// cout<<mn<<' '<<u<<endl<<endl
	for (auto [i, w] : nei[u]){
		if (Ans[i] > Ans[u] + w)
			Ans[i] = Ans[u] + w,
			st.insert({Ans[i], i});
	}
	if (cnt == Ans.size())
		return;
	Nxt = getMinA();
	Asends(min(510, Nxt.first - Last), 9);
	L = 9, K = 0, num = 0;
}

void InitA(int N, int A, vector<int> U, vector<int> V, vector<int> C) {
	Ans.resize(N, 1e9);
	Ans[0] = 0;

	for (int i=0;i<A;i++){
		nei[U[i]].push_back({V[i], C[i]});
		nei[V[i]].push_back({U[i], C[i]});
	}
	for (int i=0;i<N;i++)
		st.insert({Ans[i], i});
	relaxA(0, 0);
}

void ReceiveA(bool x) {
	num += num + x, K++;
	if (K == L){
		if (L == 9 and num == 511){
			Asends(Nxt.second, 11);
			relaxA(Nxt.first, Nxt.second);
		}
		else if (L == 9){
			Nxt.first = num + Last;
			K = 0, num = 0, L = 11;
		}
		else{
			Nxt.second = num;
			relaxA(Nxt.first, Nxt.second);
		}
	}
}

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

using namespace std;

namespace {
	const int M = 1<<11;
	vector<pair<int, int>> nei[M];
	vector<int> Ans;
	set<pair<int, int>> st;
	int L, K, num, Last, cnt = 0;
	pair<int, int> Nxt;
}

void Bsends(int v, int k){
	for (int i=k-1;i+1;i--)
		SendB(!!(v & (1<<i)));
}

pair<int, int> getMinB(){
	auto [mn, u] = *begin(st);
	if (mn == Ans[u])
		return {mn, u};
	st.erase(begin(st));
	return getMinB();
}

void relaxB(int mn, int u){
	Last = mn, cnt ++;
	st.erase({mn, u});
	Ans[u] = mn;
	for (auto [i, w] : nei[u]){
		if (Ans[i] > Ans[u] + w)
			Ans[i] = Ans[u] + w,
			st.insert({Ans[i], i});
	}
	if (cnt == Ans.size())
		return;
	Nxt = getMinB();
	L = 9, K = 0, num = 0;
}


void InitB(int N, int B, vector<int> U, vector<int> V, vector<int> C) {
	Ans.resize(N, 1e9);
	Ans[0] = 0;

	for (int i=0;i<B;i++){
		nei[U[i]].push_back({V[i], C[i]});
		nei[V[i]].push_back({U[i], C[i]});
	}
	for (int i=0;i<N;i++)
		st.insert({Ans[i], i});
	relaxB(0, 0);
}

void ReceiveB(bool y) {
	num += num + y, K ++;
	if (K == L){
		if (L == 9 and num > Nxt.first - Last){
			Bsends(Nxt.first - Last, 9);
			Bsends(Nxt.second, 11);
			relaxB(Nxt.first, Nxt.second);
		}
		else if (L == 9){
			Bsends(511, 9);
			Nxt.first = num + Last;
			K = 0, num = 0, L = 11;
		}
		else{
			Nxt.second = num;
			relaxB(Nxt.first, Nxt.second);
		}
	}
}
#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...