제출 #1328260

#제출 시각아이디문제언어결과실행 시간메모리
1328260KhoaDuyTwo Transportations (JOI19_transportations)C++20
0 / 100
143 ms1160 KiB
#include "Azer.h"
#include<bits/stdc++.h>
using namespace std;
struct dijik{
    vector<int> d;
    vector<vector<pair<int,int>>> graph;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
    int last=0;
    void add(int u,int dist){
        d[u]=dist;
        last=dist;
        for(pair<int,int> &x:graph[u]){
            int v=x.first,w=x.second;
            pq.push({d[u]+w,v});
        }
        while(!pq.empty()&&d[pq.top().second]!=-1){
            pq.pop();
        }
    }
    void init(int n,int m,vector<int> &u,vector<int> &v,vector<int> &c){
        d.assign(n,-1);
        graph.resize(n);
        for(int i=0;i<n;i++){
            int bruh=1e6;
            pq.push({bruh+1,i});
        }
        for(int i=0;i<m;i++){
            graph[u[i]].push_back({v[i],c[i]});
            graph[v[i]].push_back({u[i],c[i]});
        }
        add(0,0);
    }
};
const int valBit=20,idxBit=11;
dijik bus;
string toBin(int x,int limit){
    string s="";
    for(int i=limit-1;i>=0;i--){
        if(x&(1<<i)){
            s+='1';
        }
        else{
            s+='0';
        }
    }
    return s;
}
int toInt(string s){
    int ans=0;
    for(int i=0;i<s.length();i++){
        ans=(ans*2+(s[i]-'0'));
    }
    return ans;
}
void InitA(int n,int m,vector<int> u,vector<int> v,vector<int> c){
    bus.init(n,m,u,v,c);
    if(bus.pq.empty()){
        return;
    }
    string send=toBin(bus.pq.top().first-bus.last,valBit);
    SendA(false);
    for(int i=0;i<send.length();i++){
        if(send[i]=='1'){
            SendA(true);
        }
        else{
            SendA(false);
        }
    }
}
void processA(string s){
    if(s=="1"){
        int u=bus.pq.top().second,dist=bus.pq.top().first;
        bus.add(u,dist);
        int prev=bus.last;
        if(bus.pq.empty()){
            return;
        }
        int nxt=bus.pq.top().first;
        string send=toBin(dist-prev,valBit)+toBin(u,idxBit)+toBin(nxt-bus.last,valBit);
        SendA(true);
        for(int i=0;i<send.length();i++){
            if(send[i]=='1'){
                SendA(true);
            }
            else{
                SendA(false);
            }
        }
        return;
    }
    int dist=toInt(s.substr(0,valBit))+bus.last,u=toInt(s.substr(valBit,idxBit));
    bus.add(u,dist);
    if(bus.pq.empty()){
        return;
    }
    string send=toBin(bus.pq.top().first-bus.last,valBit);
    SendA(false);
    for(int i=0;i<send.length();i++){
        if(send[i]=='1'){
            SendA(true);
        }
        else{
            SendA(false);
        }
    }
}
int modeA=-1;
string currA="";
void ReceiveA(bool x){
    if(modeA==-1){
        if(x){
            processA("1");
        }
        else{
            modeA=0;
        }
        return;
    }
    if(x){
        currA+='1';
    }
    else{
        currA+='0';
    }
    if(currA.length()==valBit+idxBit){
        processA(currA);
        currA="",modeA=-1;
    }
}
vector<int> Answer(){
    return bus.d;
}
#include "Baijan.h"
#include<bits/stdc++.h>
using namespace std;
struct dijik2{
    vector<int> d;
    vector<vector<pair<int,int>>> graph;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
    int last=0;
    void add(int u,int dist){
        d[u]=dist;
        last=dist;
        for(pair<int,int> &x:graph[u]){
            int v=x.first,w=x.second;
            pq.push({d[u]+w,v});
        }
        while(!pq.empty()&&d[pq.top().second]!=-1){
            pq.pop();
        }
    }
    void init(int n,int m,vector<int> &u,vector<int> &v,vector<int> &c){
        d.assign(n,-1);
        graph.resize(n);
        for(int i=0;i<n;i++){
            int bruh=1e6;
            pq.push({bruh+1,i});
        }
        for(int i=0;i<m;i++){
            graph[u[i]].push_back({v[i],c[i]});
            graph[v[i]].push_back({u[i],c[i]});
        }
        add(0,0);
    }
};
const int valBit2=20,idxBit2=11;
dijik2 rail;
string toBin2(int x,int limit){
    string s="";
    for(int i=limit-1;i>=0;i--){
        if(x&(1<<i)){
            s+='1';
        }
        else{
            s+='0';
        }
    }
    return s;
}
int toInt2(string s){
    int ans=0;
    for(int i=0;i<s.length();i++){
        ans=(ans*2+(s[i]-'0'));
    }
    return ans;
}
void InitB(int n,int m,vector<int> s,vector<int> t,vector<int> d){
    rail.init(n,m,s,t,d);
}
void processB(string s){
    if(s.length()==valBit2+idxBit2){
        int dist=toInt2(s.substr(0,valBit2))+rail.last,u=toInt2(s.substr(valBit2,idxBit2));
        rail.add(u,dist);
        return;
    }
    int val=toInt2(s)+rail.last,dist=rail.pq.top().first;
    if(val<dist){
        SendB(true);
    }
    else{
        int u=rail.pq.top().second;
        string send=toBin2(dist-rail.last,valBit2)+toBin2(u,idxBit2);
        rail.add(u,dist);
        SendB(false);
        for(int i=0;i<send.length();i++){
            if(send[i]=='1'){
                SendB(true);
            }
            else{
                SendB(false);
            }
        }
    }
}
int modeB=-1;
string currB="";
void ReceiveB(bool y){
    if(modeB==-1){
        if(y){
            modeB=1;
        }
        else{
            modeB=0;
        }
        return;
    }
    if(y){
        currB+='1';
    }
    else{
        currB+='0';
    }
    if(!modeB){
        if(currB.length()==valBit2){
            processB(currB);
            currB="",modeB=-1;
        }
    }
    else{
        if(currB.length()==valBit2+idxBit2){
            processB(currB);
        }
        else if(currB.length()==2*valBit2+idxBit2){
            processB(currB.substr(valBit2+idxBit2,valBit2));
            currB="",modeB=-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...