제출 #1150236

#제출 시각아이디문제언어결과실행 시간메모리
1150236fatman87878Two Transportations (JOI19_transportations)C++20
6 / 100
177 ms10368 KiB
#include "Azer.h"
#include<bits/stdc++.h>
using namespace std;
#define IOS cin.tie(nullptr)->sync_with_stdio(0),cin.exceptions(cin.failbit);
#define lb(x) (x)&-(x)
#define all(x) (x).begin(),(x).end()
#define ll long long

namespace {

	constexpr int maxN=2e3+5;

	int n,dis[maxN],lstdis,nowdis,len,type,val,determined;
	
	// type 1 : dis
	// type 2 : idx
	
	vector<pair<int,int>> adj[maxN];
	
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
	
	inline void sendIdx(int v){
		//cout<<"A send idx "<<v<<'\n';
		for(int i = 11;i--;)SendA(v>>i&1);
	}
	
	inline void sendDis(int v){
		//cout<<"A send dist "<<v<<'\n';
		for(int i = 9;i--;)SendA(v>>i&1);
	}
	
	inline void push1(){
		for(int cnt = 1;!pq.empty();){
			auto [d,u] = pq.top();
			if(d!=dis[u]){
				pq.pop();
				continue;
			}
			if(!cnt){
				nowdis = d;
				sendDis(d-lstdis);
				val = 0;
				type = 1;
				len = 0;
				return;
			}
			pq.pop();
			cnt--;
			determined++;
			for(auto [v,c]:adj[u])if(dis[v]>dis[u]+c)pq.emplace(dis[v]=dis[u]+c,v);
		}
		if(determined==n)return;
		nowdis = 511+lstdis;
		sendDis(511);
		val = 0;
		type = 1;
		len = 0;
	}
}

void InitA(int N, int A, std::vector<int> U, std::vector<int> V,std::vector<int> C) {
	n=N;
	for(int i = 0;i<A;i++){
		adj[U[i]].emplace_back(V[i],C[i]);
		adj[V[i]].emplace_back(U[i],C[i]);
	}
	fill(dis,dis+n,1e9);
	pq.emplace(dis[0] = 0,0);
	push1();
}

void ReceiveA(bool x) {
	len++;
	val<<=1;
	val|=x;
	if(type==1){
		if(len==9){
			//cout<<"A receives dist "<<val<<'\n';
			if(nowdis>=val+lstdis){
				lstdis += val;
				val = 0;
				type = 2;
				len = 0;
				return;
			}
			lstdis = nowdis;
			sendIdx(pq.top().second);
			push1();
		}
	}
	else {
		if(len==11){
			//cout<<"A receives index "<<val<<"\n";
			pq.emplace(dis[val] = lstdis,val);
			push1();
		}
	}
}

std::vector<int> Answer() {
	vector<int> res(n);
	for(int i = 0;i<n;i++)res[i] = dis[i];
	return res;
}
#include "Baijan.h"
#include<bits/stdc++.h>
using namespace std;
#define IOS cin.tie(nullptr)->sync_with_stdio(0),cin.exceptions(cin.failbit);
#define lb(x) (x)&-(x)
#define all(x) (x).begin(),(x).end()
#define ll long long

namespace {

	constexpr int maxN=2e3+5;

	int n,dis[maxN],lstdis,nowdis,len,type,val,determined;

	// type 1 : dis
	// type 2 : idx
	
	vector<pair<int,int>> adj[maxN];
	
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
	
	inline void sendIdx(int v){
		//cout<<"B send idx "<<v<<'\n';
		for(int i = 11;i--;)SendB(v>>i&1);
	}
	
	inline void sendDis(int v){
		//cout<<"B send dist "<<v<<'\n';
		for(int i = 9;i--;)SendB(v>>i&1);
	}
	
	inline void push1(){
		for(int cnt = 1;!pq.empty();){
			auto [d,u] = pq.top();
			if(d!=dis[u]){
				pq.pop();
				continue;
			}
			if(!cnt){
				nowdis = d;
				sendDis(d-lstdis);
				val = 0;
				type = 1;
				len = 0;
				return;
			}
			pq.pop();
			cnt--;
			determined++;
			for(auto [v,c]:adj[u])if(dis[v]>dis[u]+c)pq.emplace(dis[v]=dis[u]+c,v);
		}
		if(determined==n)return;
		nowdis = 511+lstdis;
		sendDis(511);
		val = 0;
		type = 1;
		len = 0;
	}
}

void InitB(int N, int B, std::vector<int> U, std::vector<int> V,std::vector<int> C) {
	n=N;
	for(int i = 0;i<B;i++){
		adj[U[i]].emplace_back(V[i],C[i]);
		adj[V[i]].emplace_back(U[i],C[i]);
	}
	fill(dis,dis+n,1e9);
	pq.emplace(dis[0] = 0,0);
	push1();
}

void ReceiveB(bool x) {
	len++;
	val<<=1;
	val|=x;
	if(type==1){
		if(len==9){
			//cout<<"B receives dist "<<val<<'\n';
			if(nowdis>val+lstdis){
				lstdis += val;
				val = 0;
				type = 2;
				len = 0;
				return;
			}
			lstdis = nowdis;
			sendIdx(pq.top().second);
			push1();
		}
	}
	else {
		if(len==11){
			//cout<<"B receives index "<<val<<"\n";
			pq.emplace(dis[val] = lstdis,val);
			push1();
		}
	}
}
#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...