This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "Azer.h"
#include <bits/stdc++.h>
using namespace std;
namespace
{
using vi = vector<int>;
using vvi = vector<vi>;
using pii = pair<int, int>;
using vpii = vector<pii>;
const int mx = 2'000;
const int inf = 1'000'000'000;
const int dl = 9;
const int ul = 11;
int N;
vpii edge[mx];
vi currdist;
set<pii> options;
pii get_option()
{
while(1)
{
if(options.empty())
return {inf, 0};
int d = options.begin()->first;
int u = options.begin()->second;
// cerr << "azer ";
// cerr << d << ' ' << u << " : " << currdist[u] << '\n';
// cerr << d << " -> " << u << '\n';
// cerr << currdist[u] << '\n';
if(d >= currdist[u])
{
// cerr << "terminated\n";
options.erase(options.begin());
}
else
{
// cerr << "returned\n";
return {d, u};
}
}
}
int lastdist = 0;
int it = 0;
int phase = 0;
int bt = 0;
int mydist = 0;
int myloc = 0;
int recdist = 0;
int recloc = 0;
int actdist = 0;
int actloc = 0;
}
void InitA(int N_, int A, vi U, vi V, vi C)
{
assert(N <= 7);
N = N_;
for(int j = 0; j < A; j++)
{
edge[U[j]].push_back({V[j], C[j]});
edge[V[j]].push_back({U[j], C[j]});
}
currdist = vi(N, inf);
currdist[0] = 0;
for(pii e : edge[0])
options.insert({e.second + 0, e.first});
pii du = get_option();
mydist = du.first;
myloc = du.second;
mydist = min(mydist, lastdist + 501);
for(int b = 0; b < dl; b++)
SendA((mydist - lastdist) & (1<<b));
// cerr << "Azer first sends " << mydist << '\n';
}
void ReceiveA(bool x)
{
if(phase == 0)
{
if(x)
recdist += (1<<bt);
bt++;
if(bt == dl)
{
// cerr << it << " Azer = " << mydist << " Baijan = " << recdist << '\n';
if(mydist < recdist) //MAKE SURE IT IS <= IN THE OTHER PROGRAM
{
for(int b = 0; b < ul; b++)
SendA(myloc & (1<<b));
actdist = mydist;
actloc = myloc;
//go down
}
else
{
phase = 1;
bt = 0;
// cerr << "Azer goes to phase " << 1 << '\n';
return;
}
}
else
return;
}
else if(phase == 1)
{
// cerr << "Azer in phase 1 " << '\n';
// cerr << "it = " << it << '\n';
if(x)
recloc += (1<<bt);
bt++;
if(bt < ul)
return;
else
{
// cerr << "Azer received best option from Baijan : " << recloc << " at " << recdist << '\n';
actdist = recdist;
actloc = recloc;
//go down
}
}
currdist[actloc] = actdist;
for(pii vp : edge[actloc])
options.insert({vp.second + actdist, vp.first});
// cerr << "Azer activated outgoing edges from " << actloc << '\n';
lastdist = max(lastdist, actdist);
// cerr << "Azer : \n";
// cerr << "phase " << it << " terminated\n";
// for(int i = 0; i < N; i++)
// cerr << currdist[i] << ' ';
// cerr << '\n';
it++;
if(it == N-1)
return;
phase = 0;
bt = 0;
pii du = get_option();
mydist = du.first;
myloc = du.second;
mydist = min(mydist, lastdist + 501);
for(int b = 0; b < dl; b++)
SendA((mydist - lastdist) & (1<<b));
recdist = lastdist;
recloc = 0;
// cerr << "\n\n\n\n";
}
vi Answer()
{
return currdist;
}
#include "Baijan.h"
#include <bits/stdc++.h>
using namespace std;
namespace
{
using vi = vector<int>;
using vvi = vector<vi>;
using pii = pair<int, int>;
using vpii = vector<pii>;
const int mx = 2'000;
const int inf = 1'000'000'000;
const int dl = 9;
const int ul = 11;
int N;
vpii edge[mx];
vi currdist;
set<pii> options;
pii get_option()
{
while(1)
{
if(options.empty())
{
// cerr << "Baijan returned empty\n";
return {inf, 0};
}
int d = options.begin()->first;
int u = options.begin()->second;
// cerr << "baijan \n";
// cerr << d << ' ' << u << " : " << currdist[u] << '\n';
if(d >= currdist[u])
{
// cerr << "terminated\n";
options.erase(options.begin());
}
else
{
// cerr << "returned\n";
return {d, u};
}
}
}
int lastdist = 0;
int it = 0;
int phase = 0;
int bt = 0;
int mydist = 0;
int myloc = 0;
int recdist = 0;
int recloc = 0;
int actdist = 0;
int actloc = 0;
}
void InitB(int N_, int A, vi U, vi V, vi C)
{
N = N_;
for(int j = 0; j < A; j++)
{
edge[U[j]].push_back({V[j], C[j]});
edge[V[j]].push_back({U[j], C[j]});
}
currdist = vi(N, inf);
currdist[0] = 0;
for(pii e : edge[0])
options.insert({e.second + 0, e.first});
pii du = get_option();
mydist = du.first;
myloc = du.second;
mydist = min(mydist, lastdist + 501);
for(int b = 0; b < dl; b++)
SendB((mydist - lastdist) & (1<<b));
// cerr << "Baijan first sends " << mydist << '\n';
}
void ReceiveB(bool x)
{
if(phase == 0)
{
if(x)
recdist += (1<<bt);
bt++;
if(bt == dl)
{
// cerr << "Baijan received option " <<
if(mydist <= recdist)
{
// cerr << "Baijan sending location\n";
for(int b = 0; b < ul; b++)
SendB(myloc & (1<<b));
actdist = mydist;
actloc = myloc;
//go down
// cerr << "Baijan sent location " << myloc << " at " << mydist << '\n';
}
else
{
phase = 1;
bt = 0;
// cerr << "Baijan goes to phase 1\n";
return;
}
}
else
return;
}
else if(phase == 1)
{
if(x)
recloc += (1<<bt);
bt++;
if(bt < ul)
return;
else
{
actdist = recdist;
actloc = recloc;
//go down
}
}
currdist[actloc] = actdist;
for(pii vp : edge[actloc])
{
options.insert({vp.second + actdist, vp.first});
// cerr << vp.first << " at " << vp.second + actdist << " : " << "Baijan" << '\n';
}
// cerr << "Baijan activated outgoing edges from " << actloc << '\n';
lastdist = max(lastdist, actdist);
// cerr << "Baijan : \n";
// cerr << "phase " << it << " terminated\n";
// for(int i = 0; i < N; i++)
// cerr << currdist[i] << ' ';
// cerr << '\n';
it++;
if(it == N-1)
return;
phase = 0;
bt = 0;
pii du = get_option();
mydist = du.first;
myloc = du.second;
// cerr << "now my dist = " << mydist << '\n';
// cerr << "lastdist = " << lastdist << '\n';
mydist = min(mydist, lastdist + 501);
for(int b = 0; b < dl; b++)
SendB((mydist - lastdist) & (1<<b));
// cerr << "Baijan sending distance " << mydist << " for " << myloc << '\n';
recdist = lastdist;
recloc = 0;
// cerr << "\n\n\n\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |