Submission #1220476

#TimeUsernameProblemLanguageResultExecution timeMemory
1220476siewjhTwo Transportations (JOI19_transportations)C++20
100 / 100
316 ms48912 KiB
#include "Azer.h"
#include <bits/stdc++.h>
using namespace std;

namespace {
    const int MAXN = 2005;
    const int inf = 1e9;
    int N, pd = 0;
    int dist[MAXN];
    bool vis[MAXN];
    vector<pair<int, int>> adj[MAXN];
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

    int dcnt = 0, dval = 0, xcnt = 0, xval = 0, cntid = 0;

	void clear(){
		dcnt = 0; dval = 0; xcnt = 0; xval = 0;
	}
    void send(int x, int b){
        for (int i = 0; i < b; i++) SendA(x & (1 << i));
    }
    void process(int x){
		cntid++; vis[x] = 1;
		for (auto [nn, nd] : adj[x])
			if (dist[nn] > dist[x] + nd){
				dist[nn] = dist[x] + nd;
				pq.push({dist[nn], nn});
			}
	}
	void sendd(){
		while (!pq.empty() && vis[pq.top().second]) pq.pop();
		if (pq.empty()) send(511, 9);
		else send(pq.top().first - pd, 9);
	}
	void compare(){
		if (!pq.empty() && pq.top().first <= pd + dval){
			int x = pq.top().second; pd = pq.top().first; pq.pop();
			send(x, 11);
			dist[x] = pd;
			process(x); clear();
			if (cntid < N) sendd();
		}
	}
	void oath(){
		int x = xval; pd += dval;
		dist[x] = pd;
		process(x); clear();
		if (cntid < N) sendd();
	}
}  // namespace

void InitA(int N, int A, vector<int> U, vector<int> V, vector<int> C){
    ::N = N;
    for (int i = 0; i < A; i++){
        int u = U[i], v = V[i], c = C[i];
        adj[u].push_back({v, c}); adj[v].push_back({u, c});
    }
    for (int i = 0; i < N; i++) dist[i] = inf;
    dist[0] = 0;
	process(0);
	if (cntid < N) sendd();
}

void ReceiveA(bool x) {
	if (dcnt < 9){
        if (x) dval += (1 << dcnt);
        dcnt++;
        if (dcnt == 9) compare();
    }
    else{
        if (x) xval += (1 << xcnt);
        xcnt++;
        if (xcnt == 11) oath();
    }
}

vector<int> Answer() {
	vector<int> ans(N);
	for (int i = 0; i < N; i++) ans[i] = dist[i];
	return ans;
}
#include "Baijan.h"
#include <bits/stdc++.h>
using namespace std;

namespace {
    const int MAXN = 2005;
    const int inf = 1e9;
    int N, pd = 0;
    int dist[MAXN];
    bool vis[MAXN];
    vector<pair<int, int>> adj[MAXN];
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

    int dcnt = 0, dval = 0, xcnt = 0, xval = 0, cntid = 0;

	void clear(){
		dcnt = 0; dval = 0; xcnt = 0; xval = 0;
	}
    void send(int x, int b){
        for (int i = 0; i < b; i++) SendB(x & (1 << i));
    }
    void process(int x){
		cntid++; vis[x] = 1;
		for (auto [nn, nd] : adj[x])
			if (dist[nn] > dist[x] + nd){
				dist[nn] = dist[x] + nd;
				pq.push({dist[nn], nn});
			}
	}
	void sendd(){
		while (!pq.empty() && vis[pq.top().second]) pq.pop();
		if (pq.empty()) send(511, 9);
		else send(pq.top().first - pd, 9);
	}
	void compare(){
		if (!pq.empty() && pq.top().first < pd + dval){
			int x = pq.top().second; pd = pq.top().first; pq.pop();
			send(x, 11);
			dist[x] = pd;
			process(x); clear();
			if (cntid < N) sendd();
		}
	}
	void oath(){
		int x = xval; pd += dval;
		dist[x] = pd;
		process(x); clear();
		if (cntid < N) sendd();
	}
}  // namespace

void InitB(int N, int B, vector<int> S, vector<int> T, vector<int> D) {
	::N = N;
	for (int i = 0; i < B; i++){
		int u = S[i], v = T[i], c = D[i];
		adj[u].push_back({v, c}); adj[v].push_back({u, c});
	}
	for (int i = 0; i < N; i++) dist[i] = inf;
	dist[0] = 0;
	process(0);
	if (cntid < N) sendd();
}

void ReceiveB(bool y) {
    if (dcnt < 9){
        if (y) dval += (1 << dcnt);
        dcnt++;
        if (dcnt == 9) compare();
    }
    else{
        if (y) xval += (1 << xcnt);
        xcnt++;
        if (xcnt == 11) oath();
    }
}
#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...