Submission #1189093

#TimeUsernameProblemLanguageResultExecution timeMemory
1189093onbertTwo Transportations (JOI19_transportations)C++20
62 / 100
392 ms81228 KiB
#include "Azer.h" #include <bits/stdc++.h> using namespace std; #define int long long namespace { const int maxn = 2005, INF = 1e10; int n, m, remain; vector<pair<int, int>> adj[maxn]; int dist[maxn]; int mx; priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq; void sendid(int id) { // cout << "Asendid " << id << endl; int val = -1; for (int i=0;i<=id;i++) val += (dist[i] == INF); // cout << val << endl; int sz = log2(remain) + 1; for (int i=0;i<sz;i++) { SendA(val & (1<<i)); // cout << (bool)(val & (1<<i)); } // cout << endl; } void sendval(int val) { // cout << "Asendval " << val << endl; for (int i=0;i<9;i++) { SendA((val-mx) & (1<<i)); // cout << (bool)((val-mx) & (1<<i)); } // cout << endl; } void firm(int u, int d) { // cout << "Afirm " << u << " " << d << endl; dist[u] = d; mx = max(d, mx); for (auto [v, w]:adj[u]) if (dist[v] == INF) pq.push({d + w, v}); remain--; } void takemine(int u, int d) { // cout << "Atakemine " << u << " " << d << endl; SendA(0); sendid(u); sendval(d); firm(u, d); while (pq.size() > 0 && dist[pq.top().second] != INF) pq.pop(); int ask = 501 + mx; if (pq.size() > 0) ask = pq.top().first; sendval(ask); } int charsleft; vector<bool> vec; int fixid(int id) { int cnt = -1; for (int i=0;i<n;i++) { cnt += (dist[i] == INF); if (cnt == id) return i; } return 69420; } void received() { int sz = log2(remain) + 1; int u = 0; for (int i=0;i<sz;i++) u += vec[i] * (1<<i); u = fixid(u); int firmval = mx; for (int i=0;i<9;i++) firmval += vec[i + sz] * (1<<i); firm(u, firmval); if (remain == 0) return; int ask = mx; for (int i=0;i<9;i++) ask += vec[i + sz + 9] * (1<<i); // cout << "Areceived " << u << " " << firmval << " " << ask << endl; while (pq.size() > 0 && (dist[pq.top().second] != INF || pq.top().second == u)) pq.pop(); if (pq.size() == 0 || pq.top().first > ask) SendA(1); else { u = pq.top().second; int d = pq.top().first; pq.pop(); takemine(u, d); } vec.clear(); } } // namespace void InitA(int32_t N, int32_t M, vector<int32_t> U, vector<int32_t> V, vector<int32_t> W) { n = N, m = M, mx = 0; remain = n; charsleft = 0; vec.clear(); for (int i=0;i<n;i++) adj[i].clear(); for (int i=0;i<m;i++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); } for (int i=0;i<n;i++) dist[i] = INF; while (pq.size()) pq.pop(); takemine(0, 0); } void ReceiveA(bool x) { // cout << 'A' << x << "\n"; if (charsleft) { vec.push_back(x); charsleft--; if (!charsleft) { received(); } return; } if (x == 0) { charsleft = log2(remain) + 1 + 9 + 9; return; } //take int u = pq.top().second, d = pq.top().first; pq.pop(); takemine(u, d); } vector<int32_t> Answer() { vector<int32_t> ans(n); for (int i=0;i<n;i++) ans[i] = dist[i]; return ans; }
#include "Baijan.h" #include <bits/stdc++.h> using namespace std; #define int long long namespace { const int maxn = 2005, INF = 1e10; int n, m, remain; vector<pair<int, int>> adj[maxn]; int dist[maxn]; int mx; priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq; void firm(int u, int d) { // cout << "Bfirm " << u << " " << d << endl; dist[u] = d; mx = max(d, mx); for (auto [v, w]:adj[u]) if (dist[v] == INF) pq.push({d + w, v}); remain--; } void sendid(int id) { // cout << "Bsendid " << id << endl; int val = -1; for (int i=0;i<=id;i++) val += (dist[i] == INF); int sz = log2(remain) + 1; for (int i=0;i<sz;i++) SendB(val & (1<<i)); } void sendval(int val) { // cout << "Bsendval " << val << endl; for (int i=0;i<9;i++) SendB((val-mx) & (1<<i)); } void takemine(int u, int d) { SendB(0); sendid(u); sendval(d); firm(u, d); while (pq.size() > 0 && dist[pq.top().second] != INF) pq.pop(); int ask = 501 + mx; if (pq.size() > 0) ask = pq.top().first; sendval(ask); } int charsleft; vector<bool> vec; int fixid(int id) { int cnt = -1; for (int i=0;i<n;i++) { cnt += (dist[i] == INF); if (cnt == id) return i; } return 69420; } void received() { // cout << "Breceived "; // for (bool i:vec) cout << i; cout << endl; int sz = log2(remain) + 1; int u = 0; for (int i=0;i<sz;i++) u += vec[i] * (1<<i); u = fixid(u); int firmval = mx; for (int i=0;i<9;i++) firmval += vec[i + sz] * (1<<i); // cout << u << " " << firmval << " " << firmval << endl; firm(u, firmval); if (remain == 0) return; int ask = mx; for (int i=0;i<9;i++) ask += vec[i + sz + 9] * (1<<i); // cout << ask << endl; while (pq.size() > 0 && (dist[pq.top().second] != INF || pq.top().second == u)) pq.pop(); if (pq.size() == 0 || pq.top().first > ask) { SendB(1); } else { u = pq.top().second; int d = pq.top().first; pq.pop(); takemine(u, d); } vec.clear(); } } // namespace void InitB(int32_t N, int32_t M, vector<int32_t> U, vector<int32_t> V, vector<int32_t> W) { n = N, m = M, mx = 0; remain = n; charsleft = 0; vec.clear(); for (int i=0;i<n;i++) adj[i].clear(); for (int i=0;i<m;i++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); } for (int i=0;i<n;i++) dist[i] = INF; while (pq.size()) pq.pop(); } void ReceiveB(bool x) { // cout << 'B' << x << " " << charsleft << "\n"; if (charsleft) { vec.push_back(x); charsleft--; if (!charsleft) { received(); } return; } if (x == 0) { charsleft = log2(remain) + 1 + 9 + 9; return; } //take int u = pq.top().second, d = pq.top().first; pq.pop(); takemine(u, 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...