Submission #1287536

#TimeUsernameProblemLanguageResultExecution timeMemory
1287536lightentheshadowTwo Transportations (JOI19_transportations)C++20
100 / 100
345 ms51708 KiB
#include "Azer.h"
#include <bits/stdc++.h>
using namespace std;

int n, m, goalBit, currBit, currNum, cntDone, bestNode = 0, bestDiff;
vector<pair<int, int>> adj[2005];
int dis[2005], currMn = 0;
bool done[2005];

void sendNum(int num, int bit) {
    if (bit == 9 && num > 500) num = 501;
    for (int i = 0; i < bit; i++)
        if (num & (1 << i)) SendA(true);
            else SendA(false);
}

void InitA(int N, int A, vector<int> U, vector<int> V, vector<int> C) {
    n = N; m = A;
    for (int i = 0; i < m; i++) {
        adj[U[i]].push_back({V[i], C[i]});
        adj[V[i]].push_back({U[i], C[i]});
    }
    for (int i = 0; i < n; i++)
        dis[i] = 1e9;
    dis[0] = 0;
    sendNum(0, 9); goalBit = 9; currBit = 0; currNum = 0; cntDone = 0;
}

void walk(int u) {
    currMn = dis[u];
    done[u] = true; cntDone++;
    for (auto [v, w]: adj[u])
        dis[v] = min(dis[v], dis[u] + w);
    if (cntDone == n) return ;
    bestNode = n; dis[n] = 1e9;
    for (int i = 0; i < n; i++)
        if (!done[i] && dis[i] < dis[bestNode]) bestNode = i;
    bestDiff = dis[bestNode] - currMn;
    sendNum(bestDiff, 9); goalBit = 9;
}

void ReceiveA(bool quinn) {
    if (quinn) currNum += (1 << currBit);
    currBit++;
    if (currBit != goalBit) return ;

    if (goalBit == 9) {
        if (bestDiff <= currNum) {
            sendNum(bestNode, 11);
            walk(bestNode);
        }
        else {
            bestDiff = currNum;
            goalBit = 11;
        }
    }
    else {
        dis[currNum] = currMn + bestDiff;
        walk(currNum);
    }

    currBit = currNum = 0;
}

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

int n, m, goalBit, currBit, currNum, cntDone, bestNode = 0, bestDiff;
vector<pair<int, int>> adj[2005];
int dis[2005], currMn = 0;
bool done[2005];

void sendNum(int num, int bit) {
    if (bit == 9 && num > 500) num = 501;
    for (int i = 0; i < bit; i++)
        if (num & (1 << i)) SendB(true);
            else SendB(false);
}

void InitB(int N, int A, vector<int> U, vector<int> V, vector<int> C) {
    n = N; m = A;
    for (int i = 0; i < m; i++) {
        adj[U[i]].push_back({V[i], C[i]});
        adj[V[i]].push_back({U[i], C[i]});
    }
    for (int i = 0; i < n; i++)
        dis[i] = 1e9;
    dis[0] = 0;
    sendNum(0, 9); goalBit = 9; currBit = 0; currNum = 0; cntDone = 0;
}

void walk(int u) {
    currMn = dis[u];
    done[u] = true; cntDone++;
    for (auto [v, w]: adj[u])
        dis[v] = min(dis[v], dis[u] + w);

    if (cntDone == n) return ;
    bestNode = n; dis[n] = 1e9;
    for (int i = 0; i < n; i++)
        if (!done[i] && dis[i] < dis[bestNode]) bestNode = i;
    bestDiff = dis[bestNode] - currMn;
    sendNum(bestDiff, 9); goalBit = 9;
}

void ReceiveB(bool han) {
    if (han) currNum += (1 << currBit);
    currBit++;
    if (currBit != goalBit) return ;

    if (goalBit == 9) {
        if (bestDiff < currNum) {
            sendNum(bestNode, 11);
            walk(bestNode);
        }
        else {
            bestDiff = currNum;
            goalBit = 11;
        }
    }
    else {
        dis[currNum] = currMn + bestDiff;
        walk(currNum);
    }

    currBit = currNum = 0;
}
#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...