제출 #1334979

#제출 시각아이디문제언어결과실행 시간메모리
1334979ofozTwo Transportations (JOI19_transportations)C++20
0 / 100
143 ms1092 KiB
#include "Azer.h"
#include <iostream>
#include <vector>
#include <set>
#include <tuple>
#define pi pair<int, int>
#define vi vector<int>
using namespace std;
namespace {
bool enableDebug = 0;
const int inf = (1<<25)-1;
const int maxn = 1<<11;
int N, cur = 0;
vi dist;
vector<vector<pi>> adj;
vi arr;
int cnt;
multiset<pi> st;
int curSize;
int dA, vA, dB, vB;
void sendIntA(int x, int sz = 20) {
    if (enableDebug) cerr << "A is sending: " << x << endl;
    for (int i = 0; i < sz; i++) SendA(x & (1<<i));
}
}  // namespace

void InitA(int N, int A, std::vector<int> U, std::vector<int> V, std::vector<int> C) {
  ::N = N;
  curSize = 20;
  st.insert({0, 0});
  dA = 0;
  vA = 0;
  dB = -1;
  vB = -1;
  dist.assign(N, inf);
  dist[0] = 0;
  adj.assign(N, vector<pi>());
  arr.clear();
  cnt = 0;
  for (int i = 0; i < A; i++) {
    adj[U[i]].push_back(make_pair(V[i], C[i]));
    adj[V[i]].push_back(make_pair(U[i], C[i]));
  }
  sendIntA(0);
}

void tryEnd() {
    dB = -1;
    vB = -1;
    for (int v = 0; v < N; v++) {
        if (dist[v] == inf) {
            sendIntA(inf);
            dA = inf;
            vA = v;
            st.insert({inf, v});
            return;
        }
    }
}

void relax(int v) {
    for (pi p : adj[v]) {
        int to, w;
        tie(to, w) = p;
        if (dist[v] + w > dist[to]) continue;
        st.erase({dist[to], to});
        dist[to] = min(dist[to], dist[v] + w);
        st.insert({dist[to], to});
    }
}

void readInt() {
    if (enableDebug) cerr << "A has received: " << cur << endl;
    if (dB == -1) {
        dB = cur;
        if (dB >= dA) {
            st.erase(st.begin());
            sendIntA(vA);
            relax(vA);
            if (st.empty()) { tryEnd(); return; }
            tie(dA, vA) = *st.begin();
            sendIntA(dA);
            dB = -1;
            vB = -1;
        }
        
        
    }
    else {
        vB = cur;
        st.erase({dist[vB], vB});
        dist[vB] = dB;
        relax(vB);
        if (st.empty()) { tryEnd(); return; }
        tie(dA, vA) = *st.begin();
        sendIntA(dA);
        dB = -1;
        vB = -1;
    }
}

void ReceiveA(bool x) {
    
    cur = cur + ((1<<cnt) * x);
    
    cnt++;
    if (cnt == curSize) {
        readInt();
        cnt = cur = 0;
    }
    
}

std::vector<int> Answer() {
    return dist;
}
#include "Baijan.h"
#include <iostream>
#include <vector>
#include <set>
#include <tuple>
#define pi pair<int, int>
#define vi vector<int>
using namespace std;
namespace b {
    bool enableDebug = 0;
    const int inf = (1<<25)-1;
    const int maxn = 1<<11;
    int N, cur = 0;
    vi dist;
    vector<vector<pi>> adj;
    vi arr;
    int cnt;
    multiset<pi> st;
    int curSize;
    int dA, vA, dB, vB;
    void sendIntB(int x, int sz = 20) {
        if (enableDebug) cerr << "B is sending: " << x << endl;
        for (int i = 0; i < sz; i++) SendB(x & (1<<i));
    }
    void initB(int N, int A, std::vector<int> U, std::vector<int> V, std::vector<int> C) {
        N = N;
        curSize = 20;
        st.insert({0, 0});
        dA = -1;
        vA = -1;
        dB = 0;
        vB = 0;
        dist.assign(N, inf);
        dist[0] = 0;
        adj.assign(N, vector<pi>());
        arr.clear();
        cnt = 0;
        for (int i = 0; i < A; i++) {
            adj[U[i]].push_back(make_pair(V[i], C[i]));
            adj[V[i]].push_back(make_pair(U[i], C[i]));
        }
    }
    void relax(int v) {
        for (pi p : adj[v]) {
            int to, w;
            tie(to, w) = p;
            if (dist[v] + w > dist[to]) continue;
            st.erase({dist[to], to});
            dist[to] = min(dist[to], dist[v] + w);
            st.insert({dist[to], to});
        }
    }
    void readInt() {
        if (enableDebug) cerr << "B has received: " << cur << endl;
        if (dA == -1) {
            dA = cur;
            sendIntB(dB);
            if (dA > dB) {
                sendIntB(vB);
                relax(vB);
                st.erase(st.begin());
                if (st.empty()) return;
                tie(dB, vB) = *st.begin();
                vA = -1;
                dA = -1;
            }
        }
        else {
            vA = cur;
            st.erase({dist[vA], vA});
            dist[vA] = dA;
            relax(vA);
            if (st.empty()) return;
            tie(dB, vB) = *st.begin();
            dA = -1;
            vA = -1;
        }
    }
    void receiveB(bool x) {
        cur = cur + ((1<<cnt) * x);
        
        cnt++;
        if (cnt == curSize) {
            readInt();
            cnt = cur = 0;
        }
    }
}  // namespace

void InitB(int N, int A, std::vector<int> U, std::vector<int> V, std::vector<int> C) {
    b::initB(N, A, U, V, C);
}

void ReceiveB(bool x) {
    b::receiveB(x);
}
#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...