Submission #1163940

#TimeUsernameProblemLanguageResultExecution timeMemory
1163940steveonalexTwo Transportations (JOI19_transportations)C++20
100 / 100
315 ms48904 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

#define MASK(i) (1ULL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
#define ALL(v) (v).begin(), (v).end()

ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
ll gcd(ll a, ll b){return __gcd(a, b);}
ll lcm(ll a, ll b){return a / gcd(a, b) * b;}

ll LASTBIT(ll mask){return (mask) & (-mask);}
int pop_cnt(ull mask){return __builtin_popcountll(mask);}
int ctz(ull mask){return __builtin_ctzll(mask);}
int logOf(ull mask){return 63 - __builtin_clzll(mask);}

//mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
mt19937_64 rng(1);
ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);}

template <class T1, class T2>
    bool maximize(T1 &a, T2 b){
        if (a < b) {a = b; return true;}
        return false;
    }

template <class T1, class T2>
    bool minimize(T1 &a, T2 b){
        if (a > b) {a = b; return true;}
        return false;
    }

template <class T>
    void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){
        for(auto item: container) out << item << separator;
        out << finish;
    }

template <class T>
    void remove_dup(vector<T> &a){
        sort(ALL(a));
        a.resize(unique(ALL(a)) - a.begin());
    }

#include "Azer.h"

const int INF = 1e9 + 69;

struct Edge{
    int u, v, w;
    Edge(int u = 0, int v = 0, int w = 0): u(u), v(v), w(w){}
};

struct P{
    int i, w;
    P(int i = 0, int w = 0): i(i), w(w){}
};

struct compare{
    bool operator () (P a, P b){return a.w > b.w;}
};


int DecodeSignal(vector<bool> signal){
    int ans = 0;
    for(int i = 0; i < (int) signal.size(); ++i) ans += MASK(i) * signal[i];
    return ans;
}

int n1, ma1;
vector<bool> infoA;
vector<vector<P>> graph1;
vector<bool> visited1;
vector<int> dihh1;
priority_queue<P, vector<P>, compare> pq1;
bool accelerated_mode1;

void InitA(int n, int m, vector<int> u, vector<int> v, vector<int> w){
    n1 = n; ma1 = 0; accelerated_mode1 = false;
    infoA.clear(); graph1.clear(); visited1.clear(); dihh1.clear();
    while(pq1.size()) pq1.pop();

    graph1.resize(n);
    for(int i = 0; i < m; ++i){
        graph1[u[i]].push_back(P(v[i], w[i]));
        graph1[v[i]].push_back(P(u[i], w[i]));
    }

    visited1.resize(n); dihh1.resize(n, INF);
    dihh1[0] = 0;
    visited1[0] = 1;

    pq1.push(P(2047, MASK(20) - 1));
    for(P v: graph1[0]) if (minimize(dihh1[v.i], dihh1[0] + v.w))
        pq1.push(P(v.i, dihh1[v.i]));

    int cur = pq1.top().w;
    minimize(cur, 511);
    for(int j = 0; j < 9; ++j) SendA(GETBIT(cur, j));
}

void ReceiveA(bool x){
    infoA.push_back(x);
    if (accelerated_mode1 == false){
        if (infoA.size() == 9){
            int cur = DecodeSignal(infoA);
            infoA.clear();
            cur += ma1;
            if (cur >= pq1.top().w){
                P u = pq1.top(); pq1.pop();
                if (u.i >= n1) return;
                if (!visited1[u.i]) {
                    visited1[u.i] = true;
                    minimize(dihh1[u.i], u.w);
                    maximize(ma1, u.w);
                    for(P v: graph1[u.i])
                        if (minimize(dihh1[v.i], dihh1[u.i] + v.w))
                            pq1.push(P(v.i, dihh1[v.i]));

                    for(int j = 0; j < 11; ++j) SendA(GETBIT(u.i, j));
                }

                while(true){
                    P u = pq1.top();
                    if (u.i >= n1) break;
                    if (visited1[u.i])
                        pq1.pop();
                    else break;
                }

                cur = pq1.top().w;
                cur -= ma1;
                minimize(cur, 511);
                for(int j = 0; j < 9; ++j) SendA(GETBIT(cur, j));
            }
            else{
                accelerated_mode1 = true;
                ma1 = cur;
            }
        }
    }
    else{
        if (infoA.size() == 11){
            int u = DecodeSignal(infoA);
            infoA.clear();

            if (!visited1[u]){
                visited1[u] = true;
                minimize(dihh1[u], ma1);
                for(P v: graph1[u])
                    if (minimize(dihh1[v.i], dihh1[u] + v.w))
                        pq1.push(P(v.i, dihh1[v.i]));
            }

            while(true){
                P u = pq1.top();
                if (u.i >= n1) break;
                if (visited1[u.i])
                    pq1.pop();
                else break;
            }

            int cur = pq1.top().w;
            cur -= ma1;
            minimize(cur, 511);

            for(int j = 0; j < 9; ++j) SendA(GETBIT(cur, j));
            accelerated_mode1 = false;
        }
    }
}

vector<int> Answer(){
    return dihh1;
}
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

#define MASK(i) (1ULL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
#define ALL(v) (v).begin(), (v).end()

ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
ll gcd(ll a, ll b){return __gcd(a, b);}
ll lcm(ll a, ll b){return a / gcd(a, b) * b;}

ll LASTBIT(ll mask){return (mask) & (-mask);}
int pop_cnt(ull mask){return __builtin_popcountll(mask);}
int ctz(ull mask){return __builtin_ctzll(mask);}
int logOf(ull mask){return 63 - __builtin_clzll(mask);}

//mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
mt19937_64 rng(1);
ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);}

template <class T1, class T2>
    bool maximize(T1 &a, T2 b){
        if (a < b) {a = b; return true;}
        return false;
    }

template <class T1, class T2>
    bool minimize(T1 &a, T2 b){
        if (a > b) {a = b; return true;}
        return false;
    }

template <class T>
    void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){
        for(auto item: container) out << item << separator;
        out << finish;
    }

template <class T>
    void remove_dup(vector<T> &a){
        sort(ALL(a));
        a.resize(unique(ALL(a)) - a.begin());
    }


#include "Baijan.h"

const int INF = 1e9 + 69;

struct Edge{
    int u, v, w;
    Edge(int u = 0, int v = 0, int w = 0): u(u), v(v), w(w){}
};

struct P{
    int i, w;
    P(int i = 0, int w = 0): i(i), w(w){}
};

struct compare{
    bool operator () (P a, P b){return a.w > b.w;}
};



int DecodeSignal(vector<bool> signal){
    int ans = 0;
    for(int i = 0; i < (int) signal.size(); ++i) ans += MASK(i) * signal[i];
    return ans;
}


int n2, ma2;
vector<bool> infoB;
vector<vector<P>> graph2;
vector<bool> visited2;
vector<int> dihh2;
priority_queue<P, vector<P>, compare> pq2;
bool accelerated_mode2;


void InitB(int n, int m, vector<int> u, vector<int> v, vector<int> w){
    n2 = n; ma2 = 0; accelerated_mode2 = false;
    infoB.clear(); graph2.clear(); visited2.clear(); dihh2.clear();
    while(pq2.size()) pq2.pop();

    graph2.resize(n);
    for(int i = 0; i < m; ++i){
        graph2[u[i]].push_back(P(v[i], w[i]));
        graph2[v[i]].push_back(P(u[i], w[i]));
    }

    visited2.resize(n); dihh2.resize(n, INF);
    dihh2[0] = 0;
    visited2[0] = 1;

    pq2.push(P(2047, MASK(20) - 1));
    for(P v: graph2[0]) if (minimize(dihh2[v.i], dihh2[0] + v.w))
        pq2.push(P(v.i, dihh2[v.i]));

    int cur = pq2.top().w;
    minimize(cur, 511);
    for(int j = 0; j < 9; ++j) SendB(GETBIT(cur, j));
}

void ReceiveB(bool x){
    infoB.push_back(x);
    if (accelerated_mode2 == false){
        if (infoB.size() == 9){
            int cur = DecodeSignal(infoB);
            infoB.clear();
            cur += ma2;
            if (cur > pq2.top().w){
                P u = pq2.top(); pq2.pop();
                if (u.i >= n2) return;
                if (!visited2[u.i]) {
                    visited2[u.i] = true;
                    minimize(dihh2[u.i], u.w);
                    maximize(ma2, u.w);
                    for(P v: graph2[u.i])
                        if (minimize(dihh2[v.i], dihh2[u.i] + v.w))
                            pq2.push(P(v.i, dihh2[v.i]));

                    for(int j = 0; j < 11; ++j) SendB(GETBIT(u.i, j));
                }

                while(true){
                    P u = pq2.top();
                    if (u.i >= n2) break;
                    if (visited2[u.i])
                        pq2.pop();
                    else break;
                }

                cur = pq2.top().w;
                cur -= ma2;
                minimize(cur, 511);
                for(int j = 0; j < 9; ++j) SendB(GETBIT(cur, j));
            }
            else{
                accelerated_mode2 = true;
                ma2 = cur;
            }
        }
    }
    else{
        if (infoB.size() == 11){
            int u = DecodeSignal(infoB);
            infoB.clear();

            if (!visited2[u]){
                visited2[u] = true;
                minimize(dihh2[u], ma2);
                for(P v: graph2[u])
                    if (minimize(dihh2[v.i], dihh2[u] + v.w))
                        pq2.push(P(v.i, dihh2[v.i]));
            }

            while(true){
                P u = pq2.top();
                if (u.i >= n2) break;
                if (visited2[u.i])
                    pq2.pop();
                else break;
            }

            int cur = pq2.top().w;
            cur -= ma2;
            minimize(cur, 511);

            for(int j = 0; j < 9; ++j) SendB(GETBIT(cur, j));
            accelerated_mode2 = false;
        }
    }
}
#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...