#include <cstdio>
#include <vector>
#include <algorithm>
#include "kollib.h"
#include "message.h"
#define MAXM 203
typedef std::pair<int,int> PI;
int id;
int n,m,p;
int D[MAXM];
std::vector<PI> R;
int main()
{
id = MyNodeId();
n = NumberOfStudents();
m = NumberOfQueries();
p = NumberOfNodes();
for(int q = id+1; q <= m; q+=p)
{
int from = QueryFrom(q);
int to = QueryTo(q);
if(from == to)
{
R.push_back({q,0});
//printf("%d %d\n",q,0);
continue;
}
int d = 1;
int v0 = from,u0 = from;
int v = FirstNeighbor(v0);
int u = SecondNeighbor(u0);
while(v != to && u != to)
{
++d;
v0 = FirstNeighbor(v) == v0 ? SecondNeighbor(v) : FirstNeighbor(v);
std::swap(v,v0);
u0 = FirstNeighbor(u) == u0 ? SecondNeighbor(u) : FirstNeighbor(u);
std::swap(u,u0);
}
R.push_back({q,d});
//printf("%d %d\n",q,d);
}
if(id != 0)
{
PutInt(0,(int)R.size());
for(auto& pi : R) PutInt(0,pi.first),PutInt(0,pi.second);
Send(0);
}
else
{
int count = m;
for(auto& pi : R) D[pi.first] = pi.second,--count;
while(count)
{
int src = Receive(-1);
int rsize = GetInt(src);
count -= rsize;
while(rsize--)
{
int q = GetInt(src);
D[q] = GetInt(src);
}
}
for(int i = 1; i <= m; ++i) printf("%d\n",D[i]);
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <cstdio> #include <vector> #include <algorithm> #include "kollib.h" #include "message.h" #define MAXM 203 typedef std::pair<int,int> PI; int id; int n,m,p; int D[MAXM]; std::vector<PI> R; int main() { id = MyNodeId(); n = NumberOfStudents(); m = NumberOfQueries(); p = NumberOfNodes(); for(int q = id+1; q <= m; q+=p) { int from = QueryFrom(q); int to = QueryTo(q); if(from == to) { R.push_back({q,0}); //printf("%d %d\n",q,0); continue; } int d = 1; int v0 = from,u0 = from; int v = FirstNeighbor(v0); int u = SecondNeighbor(u0); while(v != to && u != to) { ++d; v0 = FirstNeighbor(v) == v0 ? SecondNeighbor(v) : FirstNeighbor(v); std::swap(v,v0); u0 = FirstNeighbor(u) == u0 ? SecondNeighbor(u) : FirstNeighbor(u); std::swap(u,u0); } R.push_back({q,d}); //printf("%d %d\n",q,d); } if(id != 0) { PutInt(0,(int)R.size()); for(auto& pi : R) PutInt(0,pi.first),PutInt(0,pi.second); Send(0); } else { int count = m; for(auto& pi : R) D[pi.first] = pi.second,--count; while(count) { int src = Receive(-1); int rsize = GetInt(src); count -= rsize; while(rsize--) { int q = GetInt(src); D[q] = GetInt(src); } } for(int i = 1; i <= m; ++i) printf("%d\n",D[i]); } return 0; } |
English