Submission #1252329

#TimeUsernameProblemLanguageResultExecution timeMemory
1252329trandangquangTwo Transportations (JOI19_transportations)C++20
100 / 100
319 ms48964 KiB
#include "Azer.h"
#include <bits/stdc++.h>
using namespace std;

/**
    3 stage:
    - stage 1: send weight
    - stage 2: compare weight, if smaller -> send node, else wait
    - stage 3: mark (if weight is larger)

    do n stages
**/

const int N=2222;
const int INF=1e9;

int nA,eA,cntStageA,curStageA; bool visA[N];
vector<int> disA;
vector<pair<int,int>> adjA[N];

void stage1A();
void stage2A();
void stage3A();

void InitA(int n, int a, vector<int> u, vector<int> v, vector<int> c){ /// input
    nA=n; eA=a;
    for(int i=0; i<a; ++i){
        adjA[u[i]].emplace_back(v[i],c[i]);
        adjA[v[i]].emplace_back(u[i],c[i]);
    }

    disA.resize(nA,INF);
    disA[0]=0;
    stage1A(); /// starting point
}

int cntrevA=0, revA=0, nxtdisA=0;
int curdisA=0, curverA=0;

void stage1A(){
    if(cntStageA==nA) return;
    ++cntStageA;

    int vdis=-1;
    for(int i=0; i<nA; ++i) if(!visA[i]){
        if(vdis==-1 || disA[vdis]>disA[i]){
            vdis=i;
        }
    }
    curverA=vdis; /// find the minimum distance from 0
    for(int i=8; i>=0; --i){
        if(disA[vdis]==INF) SendA(1);
        else SendA((disA[vdis]-curdisA)>>i&1);
    }
//    cout<<disA[vdis]-curdisA<<'\n';
    cntrevA=8, revA=0;
    curStageA=2;
}

void stage2A(){
    if(disA[curverA]-curdisA <= revA){
        for(int i=10; i>=0; --i){
            SendA(curverA>>i&1);
        }
        visA[curverA]=true;
        for(auto [i,w]:adjA[curverA]){
            disA[i]=min(disA[i],disA[curverA]+w);
        }
        curdisA=disA[curverA]; /// reupdate current min distance

        stage1A(); /// start again
    } else{
        nxtdisA=revA+curdisA; /// will take minimum from opponent's
        cntrevA=10, revA=0;
        curStageA=3;
    }
}

void stage3A(){
    curdisA=nxtdisA;
    disA[revA]=nxtdisA;
    visA[revA]=true;
    for(auto [i,w]:adjA[revA]){
        disA[i]=min(disA[i],disA[revA]+w);
    }
    stage1A();
}

void ReceiveA(bool x){
    if(x==1) revA|=(1<<cntrevA);
    --cntrevA;
    if(cntrevA==-1){
//        cout<<curStageA<<'\n';
        if(curStageA==2) stage2A();
        else if(curStageA==3) stage3A();
        else assert(0);
    }
}

vector<int> Answer(){
    return disA;
}
#include "Baijan.h"
#include <bits/stdc++.h>
using namespace std;

const int N=2222;
const int INF=1e9;

int nB,eB,cntStageB,curStageB; bool visB[N];
vector<int> disB;
vector<pair<int,int>> adjB[N];

void stage1B();
void stage2B();
void stage3B();

void InitB(int n, int b, vector<int> s, vector<int> t, vector<int> d){
    nB=n,eB=b;
    for(int i=0; i<b; ++i){
        adjB[s[i]].emplace_back(t[i],d[i]);
        adjB[t[i]].emplace_back(s[i],d[i]);
    }

    disB.resize(nB,INF);
    disB[0]=0;
    stage1B();
}

int cntrevB=0, revB=0, nxtdisB=0;
int curdisB=0, curverB=0;

void stage1B(){
    if(cntStageB==nB) return;
    ++cntStageB;

    int vdis=-1;
    for(int i=0; i<nB; ++i) if(!visB[i]){
        if(vdis==-1 || disB[vdis]>disB[i]){
            vdis=i;
        }
    }
    curverB=vdis;
    for(int i=8; i>=0; --i){
        if(disB[vdis]==INF) SendB(1);
        else SendB((disB[vdis]-curdisB)>>i&1);
    }

    cntrevB=8, revB=0;
    curStageB=2;
}

void stage2B(){
//    cout<<disB[curverB]<<" "<<curdisB<<'\n';
    if(disB[curverB]-curdisB < revB){
        for(int i=10; i>=0; --i){
            SendB(curverB>>i&1);
//            cout<<(curverB>>i&1)<<'\n';
        }
        visB[curverB]=true;
        for(auto [i,w]:adjB[curverB]){
            disB[i]=min(disB[i],disB[curverB]+w);
        }
        curdisB=disB[curverB];

        stage1B();
    } else{
        nxtdisB=revB+curdisB;
        cntrevB=10, revB=0;
        curStageB=3;
    }
}

void stage3B(){
    curdisB=nxtdisB;
    disB[revB]=nxtdisB;
    visB[revB]=true;
    for(auto [i,w]:adjB[revB]){
        disB[i]=min(disB[i],disB[revB]+w);
    }
    stage1B();
}

void ReceiveB(bool x){
    if(x==1) revB|=(1<<cntrevB);
    --cntrevB;
    if(cntrevB==-1){
        if(curStageB==2) stage2B();
        else if(curStageB==3) stage3B();
        else assert(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...