제출 #132779

#제출 시각아이디문제언어결과실행 시간메모리
132779sebinkimTwo Transportations (JOI19_transportations)C++14
68 / 100
1952 ms85384 KiB
#include <bits/stdc++.h> #include "Azer.h" using namespace std; typedef pair <int, int> pii; const int ID = 11; const int DIST = 9; namespace{ priority_queue <pii> Q; vector <pii> G[2020]; vector <int> D; bool chk[2020]; int v, c, t, f = 1234567890, b; int n, z, m; bool turn() { b = (b + 1) % 30; return (f & (1 << b)) != 0; } void sendint(int x, int l) { x = min(x, (1 << l) - 1); for(; l--; ){ SendA((x & (1 << l))? 1 : 0); } } void check() { int p, d; for(; !Q.empty(); Q.pop()){ tie(d, p) = Q.top(); d = -d; if(!chk[p] && d == D[p]) break; } if(Q.empty()) return; tie(d, p) = Q.top(); d = -d; sendint(p, ID); sendint(d - z, DIST); } void apply(int p, int d) { chk[p] = 1; D[p] = d; z = d; for(pii &t: G[p]){ if(!chk[t.first] && D[t.first] > d + t.second){ D[t.first] = d + t.second; Q.emplace(-d - t.second, t.first); } } if(turn()){ m = 1; check(); } else m = 2; } void check(int p1, int d1) { int p, d, p2, d2; for(; !Q.empty(); Q.pop()){ tie(d2, p2) = Q.top(); d2 = -d2; if(!chk[p2] && D[p2] == d2) break; } tie(d2, p2) = Q.top(); d2 = -d2; if(d1 < d2){ p = p1, d = d1; SendA(0); } else{ p = p2, d = d2; Q.pop(); SendA(1); sendint(p, ID); sendint(d - z, DIST); } apply(p, d); } } void InitA(int N, int A, vector <int> U, vector <int> V, vector<int> C) { n = N; D.resize(n, 0); int i; for(i=0; i<A; i++){ G[U[i]].emplace_back(V[i], C[i]); G[V[i]].emplace_back(U[i], C[i]); } for(i=1; i<n; i++){ D[i] = 1e9; } for(i=0; i<n; i++){ Q.emplace(-D[i], i); } apply(0, 0); } void ReceiveA(bool x) { if(m == 1){ if(t == 0){ if(!x){ int d, p; tie(d, p) = Q.top(); d = -d; Q.pop(); apply(p, d); } else t = 1; } else{ v = v << 1 | x; c ++; if(c == ID + DIST){ int p = v >> DIST; int d = z + (v & ((1 << DIST) - 1)); v = 0; c = 0; t = 0; apply(p, d); } } } else{ v = v << 1 | x; c ++; if(c == ID + DIST){ int p = v >> DIST; int d = z + (v & ((1 << DIST) - 1)); v = 0; c = 0; check(p, d); } } } vector <int> Answer() { return D; }
#include <bits/stdc++.h> #include "Baijan.h" using namespace std; typedef pair <int, int> pii; const int ID = 11; const int DIST = 9; namespace{ priority_queue <pii> Q; vector <pii> G[2020]; vector <int> D; bool chk[2020]; int v, c, t, f = 1234567890, b; int n, z, m; bool turn() { b = (b + 1) % 30; return (f & (1 << b)) != 0; } void sendint(int x, int l) { x = min(x, (1 << l) - 1); for(; l--; ){ SendB((x & (1 << l))? 1 : 0); } } void check() { int p, d; for(; !Q.empty(); Q.pop()){ tie(d, p) = Q.top(); d = -d; if(!chk[p] && d == D[p]) break; } if(Q.empty()) return; tie(d, p) = Q.top(); d = -d; sendint(p, ID); sendint(d - z, DIST); } void apply(int p, int d) { chk[p] = 1; D[p] = d; z = d; for(pii &t: G[p]){ if(!chk[t.first] && D[t.first] > d + t.second){ D[t.first] = d + t.second; Q.emplace(-d - t.second, t.first); } } if(!turn()){ m = 1; check(); } else m = 2; } void check(int p1, int d1) { int p, d, p2, d2; for(; !Q.empty(); Q.pop()){ tie(d2, p2) = Q.top(); d2 = -d2; if(!chk[p2] && D[p2] == d2) break; } tie(d2, p2) = Q.top(); d2 = -d2; if(d1 < d2){ p = p1, d = d1; SendB(0); } else{ p = p2, d = d2; Q.pop(); SendB(1); sendint(p, ID); sendint(d - z, DIST); } apply(p, d); } } void InitB(int N, int B, vector <int> S, vector<int> T, vector<int> C) { n = N; D.resize(n, 0); int i; for(i=0; i<B; i++){ G[S[i]].emplace_back(T[i], C[i]); G[T[i]].emplace_back(S[i], C[i]); } for(i=1; i<n; i++){ D[i] = 1e9; } for(i=0; i<n; i++){ Q.emplace(-D[i], i); } apply(0, 0); } void ReceiveB(bool y) { if(m == 1){ if(t == 0){ if(!y){ int d, p; tie(d, p) = Q.top(); d = -d; Q.pop(); apply(p, d); } else t = 1; } else{ v = v << 1 | y; c ++; if(c == ID + DIST){ int p = v >> DIST; int d = z + (v & ((1 << DIST) - 1)); v = 0; c = 0; t = 0; apply(p, d); } } } else{ v = v << 1 | y; c ++; if(c == ID + DIST){ int p = v >> DIST; int d = z + (v & ((1 << DIST) - 1)); v = 0; c = 0; check(p, d); } } }
#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...