제출 #785964

#제출 시각아이디문제언어결과실행 시간메모리
785964PiokemonTwo Transportations (JOI19_transportations)C++17
100 / 100
819 ms49408 KiB
#include <bits/stdc++.h> #include "Azer.h" using namespace std; typedef long long int ll; namespace { int n; vector<pair<int,int>> graf[2009]; priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> djikstra; int dst[2009]; int wczyt=0,ter=0; pair<int,int> cel; int nr=0; int last=0; int dom=0; void napisz(int x, int cnt){ //cout << "A->B " << x << '\n'; for (int i=0;i<cnt;i++) SendA(x & (1<<i)); } void nast(int v, int d){ //if (nr<10) cout << "A:" << v << ' ' << d << '\n'; dst[v] = d; last = d; for (pair<int,int> x:graf[v]){ if (dst[x.first] > d+x.second){ djikstra.push({d+x.second,x.first}); } } while(!djikstra.empty() && dst[djikstra.top().second] < 1e9) djikstra.pop(); if (djikstra.empty()){ djikstra.push({(1<<20)-1+last,0}); //if (nr<10) cout << "A empty\n"; } //if (nr<10) cout << "A->B " << djikstra.top().second << ' ' << djikstra.top().first-last << '\n'; nr++; } } // namespace void InitA(int N, int A, vector<int> U, vector<int> V, vector<int> C) { n = N; for (int x=0;x<A;x++){ graf[U[x]].push_back({V[x],C[x]}); graf[V[x]].push_back({U[x],C[x]}); } for (int x=0;x<=n;x++) dst[x] = 1e9+9; nast(0,0); napisz(djikstra.top().first-last,9); cel = {-1,-1}; } void ReceiveA(bool x) { wczyt += (1<<ter) * x; ter++; if (ter==9 && cel.second == -1){ if (djikstra.top().first >= (1<<20)-1 && wczyt == (1<<9)-1) return; cel.second = wczyt+last; ter = 0; wczyt = 0; if (dom==1) napisz(djikstra.top().first-last,9); if (djikstra.top().first<=cel.second){ napisz(djikstra.top().second,11); cel.second = djikstra.top().first; cel.first = djikstra.top().second; djikstra.pop(); nast(cel.first,cel.second); cel = {-1,-1}; dom = 1; } } if (ter==11 && cel.second != -1){ cel.first = wczyt; wczyt = 0; ter = 0; //if (nr<10) cout << "A ma:" << djikstra.top().first << ' ' << djikstra.top().second << '\n'; //if (nr<10) cout << "A dostalo: " << cel.first << ' ' << cel.second << '\n'; //if (nr<10) cout << "A twierdzi o empt: " << apuste << ' ' << bpuste << '\n'; if (min(djikstra.top().first,cel.second) >= (1<<20)-1) return; nast(cel.first,cel.second); napisz(djikstra.top().first-last,9); cel = {-1,-1}; ter = 0; wczyt = 0; dom = 0; } } vector<int> Answer() { vector<int> odp; for (int x=0;x<n;x++) odp.push_back(dst[x]); return odp; }
#include "Baijan.h" #include <bits/stdc++.h> using namespace std; typedef long long int ll; namespace { int n; vector<pair<int,int>> graf[2009]; priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> djikstra; int dst[2009]; int wczyt=0,ter=0; pair<int,int> cel; int nr=0; int last=0; int dom=0; void napisz(int x, int cnt){ //cout << "B->A " << x << '\n'; for (int i=0;i<cnt;i++) SendB(x & (1<<i)); } void nast(int v, int d){ //if (nr<10) cout << "B:" << v << ' ' << d << '\n'; dst[v] = d; last = d; //if (nr<10) cout << "lelum " << poprz << ' ' << d << '\n'; for (pair<int,int> x:graf[v]){ if (dst[x.first] > d+x.second){ djikstra.push({d+x.second,x.first}); } } while(!djikstra.empty() && dst[djikstra.top().second] < 1e9) djikstra.pop(); if (djikstra.empty()){ djikstra.push({(1<<20)-1+last,0}); } //if (nr<10) cout << "B->A " << djikstra.top().second << ' ' << djikstra.top().first-last << '\n'; nr++; } } // namespace void InitB(int N, int B, vector<int> S, vector<int> T, vector<int> D) { n = N; for (int x=0;x<B;x++){ graf[T[x]].push_back({S[x],D[x]}); graf[S[x]].push_back({T[x],D[x]}); } for (int x=0;x<=n;x++) dst[x] = 1e9+9; cel = {-1,-1}; djikstra.push({0,0}); nast(0,0); } void ReceiveB(bool y) { wczyt += (1<<ter) * y; ter++; if (ter==9 && cel.second == -1){ cel.second = wczyt+last; if (djikstra.top().first >= (1<<20)-1 && wczyt == (1<<9)-1) return; wczyt = 0; ter = 0; if (dom==0) napisz(djikstra.top().first-last,9); if (djikstra.top().first<cel.second){ napisz(djikstra.top().second,11); cel.second = djikstra.top().first; cel.first = djikstra.top().second; djikstra.pop(); nast(cel.first,cel.second); cel = {-1,-1}; dom = 0; } } if (ter==11 && cel.second != -1){ //if (nr<10) cout << "B jestem debilem: " << poprz << '\n'; cel.first = wczyt; ter = 0; wczyt = 0; //if (nr<10) cout << "B ma: " << djikstra.top().first << ' ' << djikstra.top().second << '\n'; //if (nr<10) cout << "B dostalo: " << cel.first << ' ' << cel.second << '\n'; if (min(djikstra.top().first,cel.second) >= (1<<20)-1) return; //if (nr<10) cout << "nr 2: " << apuste << ' ' << bpuste << '\n'; nast(cel.first,cel.second); napisz(djikstra.top().first-last,9); cel = {-1,-1}; dom = 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...