Submission #1189347

#TimeUsernameProblemLanguageResultExecution timeMemory
118934712345678Two Transportations (JOI19_transportations)C++20
100 / 100
288 ms49084 KiB
#include "Azer.h" #include <bits/stdc++.h> using namespace std; namespace { const int nx=2e3+5, inf=1e9, kx=9; mt19937 rng(12345678); enum MODE {WAIT, SENDER_FIRST, SENDER_WAIT, SENDER_SECOND, RECIEVER_FIRST, RECIEVER_SECOND}; MODE mode; int n, cur, mn[nx], vs[nx], mx, w, u, randm[nx], saved; vector<pair<int, int>> d[nx]; vector<int> in; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; void sendtop() { while (!pq.empty()&&vs[pq.top().second]) pq.pop(); //cout<<"send top "<<pq.top().first<<' '<<pq.top().second<<'\n'; if (pq.empty()) for (int i=0; i<kx; i++) SendA(1); else { auto [w, u]=pq.top(); for (int i=0; i<kx; i++) SendA((w-mx)&(1<<i)); } } void sendnum() { for (int i=0; i<11; i++) SendA(pq.top().second&(1<<i)); } void update(int w, int u) { //cout<<"update A "<<w<<' '<<u<<'\n'; cur++; mn[u]=mx=w, vs[u]=1; for (auto [v, cw]:d[u]) if (mn[v]>w+cw) mn[v]=w+cw, pq.push({mn[v], v}); } } void InitA(int N, int A, std::vector<int> U, std::vector<int> V, std::vector<int> C) { n=N; cur=1; for (int i=1; i<N; i++) mn[i]=inf; for (int i=0; i<A; i++) d[U[i]].push_back({V[i], C[i]}), d[V[i]].push_back({U[i], C[i]}); for (int i=1; i<=N; i++) randm[i]=rng()%2; //cout<<"randm A "<<randm[i]<<'\n'; pq.push({0, 0}); mode=WAIT; if (randm[cur]) SendA(1); } void ReceiveA(bool x) { //cout<<"mode a "<<mode<<' '<<x<<'\n'; if (mode==WAIT) { if (x==1) SendA(0), mode=SENDER_FIRST, ReceiveA(0); else mode=RECIEVER_FIRST; } else if (mode==SENDER_FIRST) { sendtop(); mode=SENDER_WAIT; } else if (mode==SENDER_WAIT) { if (x==1) mode=SENDER_SECOND; else { update(pq.top().first, pq.top().second); sendnum(); if (cur>n) return; mode=WAIT; if (randm[cur]) SendA(1); } } else if (mode==SENDER_SECOND) { in.push_back(x); if (in.size()<20) return; u=0, w=0; for (int i=0; i<11; i++) u|=in[i]<<i; for (int i=0; i<kx; i++) w|=in[i+11]<<i; in.clear(); w=mx+w; update(w, u); if (cur>n) return; mode=WAIT; if (randm[cur]) SendA(1); } else if (mode==RECIEVER_FIRST) { in.push_back(x); if (in.size()<kx) return; w=0; for (int i=0; i<kx; i++) w|=(in[i]<<i); w=mx+w; in.clear(); while (!pq.empty()&&vs[pq.top().second]) pq.pop(); int cw=INT_MAX; if (!pq.empty()) cw=pq.top().first; if (w<=cw) { SendA(0); saved=w; mode=RECIEVER_SECOND; } else { SendA(1); sendnum(); sendtop(); update(pq.top().first, pq.top().second); if (cur>n) return; mode=WAIT; if (randm[cur]) SendA(1); } } else if (mode==RECIEVER_SECOND) { in.push_back(x); if (in.size()<11) return; u=0; for (int i=0; i<11; i++) u|=(in[i]<<i); in.clear(); update(saved, u); if (cur>n) return; mode=WAIT; if (randm[cur]) SendA(1); } } std::vector<int> Answer() { std::vector<int> ans(n); for (int i=0; i<n; i++) ans[i]=mn[i]; return ans; }
#include "Baijan.h" #include <bits/stdc++.h> using namespace std; namespace { const int nx=2e3+5, inf=1e9, kx=9; mt19937 rng(12345678); enum MODE {WAIT, SENDER_FIRST, SENDER_WAIT, SENDER_SECOND, RECIEVER_FIRST, RECIEVER_SECOND}; MODE mode; int n, cur, mn[nx], vs[nx], mx, w, u, randm[nx], saved; vector<pair<int, int>> d[nx]; vector<int> in; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; void sendtop() { while (!pq.empty()&&vs[pq.top().second]) pq.pop(); if (pq.empty()) for (int i=0; i<kx; i++) SendB(1); else { auto [w, u]=pq.top(); for (int i=0; i<kx; i++) SendB((w-mx)&(1<<i)); } } void sendnum() { for (int i=0; i<11; i++) SendB(pq.top().second&(1<<i)); } void update(int w, int u) { //cout<<"update B "<<w<<' '<<u<<'\n'; cur++; mn[u]=mx=w, vs[u]=1; for (auto [v, cw]:d[u]) if (mn[v]>w+cw) mn[v]=w+cw, pq.push({mn[v], v}); } } void InitB(int N, int B, std::vector<int> S, std::vector<int> T, std::vector<int> D) { n=N; cur=1; for (int i=1; i<N; i++) mn[i]=inf; for (int i=0; i<B; i++) d[S[i]].push_back({T[i], D[i]}), d[T[i]].push_back({S[i], D[i]}); for (int i=1; i<=N; i++) randm[i]=!(rng()%2); //cout<<"randm B "<<randm[i]<<'\n'; pq.push({0, 0}); mode=WAIT; if (randm[cur]) SendB(1); } void ReceiveB(bool y) { //cout<<"mode b "<<mode<<' '<<y<<'\n'; if (mode==WAIT) { if (y==1) SendB(0), mode=SENDER_FIRST, ReceiveB(0); else mode=RECIEVER_FIRST; } else if (mode==SENDER_FIRST) { sendtop(); mode=SENDER_WAIT; } else if (mode==SENDER_WAIT) { if (y==1) mode=SENDER_SECOND; else { update(pq.top().first, pq.top().second); sendnum(); if (cur>n) return; mode=WAIT; if (randm[cur]) SendB(1); } } else if (mode==SENDER_SECOND) { in.push_back(y); if (in.size()<20) return; u=0, w=0; for (int i=0; i<11; i++) u|=in[i]<<i; for (int i=0; i<kx; i++) w|=in[i+11]<<i; in.clear(); w=mx+w; update(w, u); if (cur>n) return; mode=WAIT; if (randm[cur]) SendB(1); } else if (mode==RECIEVER_FIRST) { in.push_back(y); if (in.size()<kx) return; w=0; for (int i=0; i<kx; i++) w|=(in[i]<<i); w=mx+w; in.clear(); while (!pq.empty()&&vs[pq.top().second]) pq.pop(); int cw=INT_MAX; if (!pq.empty()) cw=pq.top().first; if (w<=cw) { SendB(0); saved=w; mode=RECIEVER_SECOND; } else { SendB(1); sendnum(); sendtop(); update(pq.top().first, pq.top().second); if (cur>n) return; mode=WAIT; if (randm[cur]) SendB(1); } } else if (mode==RECIEVER_SECOND) { in.push_back(y); if (in.size()<11) return; u=0; for (int i=0; i<11; i++) u|=(in[i]<<i); in.clear(); update(saved, u); if (cur>n) return; mode=WAIT; if (randm[cur]) SendB(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...