Submission #1325731

#TimeUsernameProblemLanguageResultExecution timeMemory
1325731adiyerTwo Transportations (JOI19_transportations)C++20
0 / 100
174 ms12828 KiB
#include "Azer.h"
#include <bits/stdc++.h>

using namespace std;

namespace {

    const int maxn = 900;
    const int maxm = 500000;
    const int inf = 1123123123;

    bool fg;

    int n, m;
    int d[maxn], u[maxm], v[maxm], c[maxm];

    set < pair < int, int > > reb;

    vector < bool > rec;    
    vector < int > g[maxn];

    pair < int, int > get(){
        while(!reb.empty()){
            int id = (reb.begin() -> second);
            if(d[u[id]] < inf && d[v[id]] < inf) reb.erase(reb.begin());
            else break;
        }
        if(reb.empty()) return {0, inf};
        int id = (reb.begin() -> second);
        int to = (d[u[id]] == inf ? u[id] : v[id]);
        int cst = c[id];
        if(d[u[id]] < inf) cst += d[u[id]];
        else cst += d[v[id]];
        return {to, cst};
    }

}

void InitA(int N, int M, vector< int > U, vector< int > V, vector < int > C){
    n = N, m = M;
    for(int i = 0; i < n; i++) d[i] = inf;
    for(int i = 0; i < m; i++) u[i] = U[i], v[i] = V[i], c[i] = C[i];
    for(int i = 0; i < m; i++) g[u[i]].push_back(i), g[v[i]].push_back(i);
    d[0] = 0;
    for(int i : g[0]) reb.insert({c[i], i});
    auto [to, cst] = get();
    for(int bit = 9; bit >= 0; bit--) SendA((to >> bit & 1));
    for(int bit = 19; bit >= 0; bit--) SendA((cst >> bit & 1));
}

void ReceiveA(bool x){
    if(!fg){
        if(x){
            auto [to, cst] = get();
            if(cst == inf) return;
            if(d[to] == inf && cst < inf){
                d[to] = cst;
                for(int i : g[to]){ 
                    if(u[i] == to && d[v[i]] == inf) reb.insert({d[to] + c[i], i});
                    if(v[i] == to && d[u[i]] == inf) reb.insert({d[to] + c[i], i});
                }
            }
            rec.clear();
            to = get().first, cst = get().second;
            for(int bit = 9; bit >= 0; bit--) SendA((to >> bit & 1));
            for(int bit = 19; bit >= 0; bit--) SendA((cst >> bit & 1));
        }
        else{
            fg = 1;
        }
        return;
    }
    else{
        rec.push_back(x);
        if(rec.size() < 30) return;
        int to = 0, cst = 0, j = 0;
        for(int bit = 9; bit >= 0; bit--) to |= (rec[j++] << bit);
        for(int bit = 19; bit >= 0; bit--) cst |= (rec[j++] << bit);
        if(cst == (1 << 20) - 1) return;
        if(d[to] == inf && cst < inf){
            d[to] = cst;
            for(int i : g[to]){ 
                if(u[i] == to && d[v[i]] == inf) reb.insert({d[to] + c[i], i});
                if(v[i] == to && d[u[i]] == inf) reb.insert({d[to] + c[i], i});
            }
        }
        rec.clear(), fg = 0;    
        to = get().first, cst = get().second;
        for(int bit = 9; bit >= 0; bit--) SendA((to >> bit & 1));
        for(int bit = 19; bit >= 0; bit--) SendA((cst >> bit & 1));
    }
}

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

using namespace std;

namespace {

    const int maxn = 900;
    const int maxm = 5000000;
    const int inf = 1123123123;

    int n, m;
    int d[maxn], u[maxm], v[maxm], c[maxm];

    set < pair < int, int > > reb;

    vector < bool > rec;
    vector < int > g[maxn];

    pair < int, int > get(){
        while(!reb.empty()){
            int id = (reb.begin() -> second);
            if(d[u[id]] < inf && d[v[id]] < inf) reb.erase(reb.begin());
            else break;
        }
        if(reb.empty()) return {0, inf};
        int id = (reb.begin() -> second);
        int to = (d[u[id]] == inf ? u[id] : v[id]);
        int cst = c[id];
        if(d[u[id]] < inf) cst += d[u[id]];
        else cst += d[v[id]];
        return {to, cst};
    }

}

void InitB(int N, int M, std::vector<int> S, std::vector<int> T, std::vector<int> D) {
    n = N, m = M;
    for(int i = 0; i < n; i++) d[i] = inf;
    for(int i = 0; i < m; i++) u[i] = S[i], v[i] = T[i], c[i] = D[i];
    for(int i = 0; i < m; i++) g[u[i]].push_back(i), g[v[i]].push_back(i);
    d[0] = 0;
    for(int i : g[0]) reb.insert({c[i], i});
}

void ReceiveB(bool y){
    rec.push_back(y);
    if(rec.size() < 30) return;
    int to = 0, cst = 0, j = 0;
    for(int bit = 9; bit >= 0; bit--) to |= (rec[j++] << bit);
    for(int bit = 19; bit >= 0; bit--) cst |= (rec[j++] << bit);
    rec.clear();
    auto [to2, cst2] = get();
    if(cst <= cst2){
        if(d[to] == inf && cst < inf){
            d[to] = cst;
            for(int i : g[to]){ 
                if(u[i] == to && d[v[i]] == inf) reb.insert({d[to] + c[i], i});
                if(v[i] == to && d[u[i]] == inf) reb.insert({d[to] + c[i], i});
            }
        }
        SendB(1);
        return;
    }
    if(d[to2] == inf && cst2 < inf){
        d[to2] = cst2;
        for(int i : g[to2]){ 
            if(u[i] == to2 && d[v[i]] == inf) reb.insert({d[to2] + c[i], i});
            if(v[i] == to2 && d[u[i]] == inf) reb.insert({d[to2] + c[i], i});
        }
    }
    SendB(0);
    for(int bit = 9; bit >= 0; bit--) SendB((to2 >> bit & 1));
    for(int bit = 19; bit >= 0; bit--) SendB((cst2 >> bit & 1));
}
#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...