Submission #1150285

#TimeUsernameProblemLanguageResultExecution timeMemory
1150285fatman87878Two Transportations (JOI19_transportations)C++20
100 / 100
314 ms49064 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;

	bitset<maxN> vis;
	
	// 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(;!pq.empty();){
			auto [d,u] = pq.top();
			if(vis[u]){
				pq.pop();
				continue;
			}
			nowdis = d;
			sendDis(d-lstdis);
			val = 0;
			type = 1;
			len = 0;
			return;
		}
		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+1,dis+n,1e9);
	determined++;
	vis[0] = 1;
	for(auto [v,c]:adj[0])if(dis[v]>dis[0]+c)
		pq.emplace(dis[v]=dis[0]+c,v);
	push1();
}

void ReceiveA(bool x) {
	len++;
	val<<=1;
	val|=x;
	int flag = 0,u;
	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(u = pq.top().second);
			pq.pop();
			flag = 1;
		}
	}
	else {
		if(len==11){
			//cout<<"A receives index "<<val<<"\n";
			dis[u = val] = lstdis;
			flag = 1;
		}
	}
	if(!flag)return;
	determined++;
	vis[u] = 1;
	for(auto [v,c]:adj[u])if(dis[v]>dis[u]+c)
		pq.emplace(dis[v]=dis[u]+c,v);
	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;

	bitset<maxN> vis;

	// 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(;!pq.empty();){
			auto [d,u] = pq.top();
			if(vis[u]){
				pq.pop();
				continue;
			}
			nowdis = d;
			sendDis(d-lstdis);
			val = 0;
			type = 1;
			len = 0;
			return;
		}
		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+1,dis+n,1e9);
	determined++;
	vis[0] = 1;
	for(auto [v,c]:adj[0])if(dis[v]>dis[0]+c)
		pq.emplace(dis[v]=dis[0]+c,v);
	push1();
}

void ReceiveB(bool x) {
	len++;
	val<<=1;
	val|=x;
	int flag = 0,u = 0;
	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(u = pq.top().second);
			pq.pop();
			flag = 1;
		}
	}
	else {
		if(len==11){
			//cout<<"B receives index "<<val<<"\n";
			dis[u = val] = lstdis;
			flag = 1;
		}
	}
	if(!flag)return;
	determined++;
	vis[u] = 1;
	for(auto [v,c]:adj[u])if(dis[v]>dis[u]+c)
		pq.emplace(dis[v]=dis[u]+c,v);
	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...