#include <cstdio>
#include <cstdlib>
#include "message.h"
#include "kollib.h"
#define N 25000001
int t[N];
int answer[201];
int main()
{
int myid = MyNodeId();
int nstudents = NumberOfStudents();
int order = 1;
if (nstudents < N) {
int iterator = 1;
t[iterator] = order;
iterator = FirstNeighbor(iterator);
while (order < nstudents) {
order++;
t[iterator] = order;
if (t[FirstNeighbor(iterator)]) {
iterator = SecondNeighbor(iterator);
} else {
iterator = FirstNeighbor(iterator);
}
}
int nqueries = NumberOfQueries();
for (int i = 1; i <= nqueries; i++) {
int from = QueryFrom(i);
int to = QueryTo(i);
int minutes = t[to] - t[from];
if (minutes < 0) minutes *= -1;
if (nstudents - minutes < minutes) {
minutes = nstudents - minutes;
}
if (!myid && nqueries) {
printf("%d\n", minutes);
}
}
} else {
int nnodes = NumberOfNodes();
int nqueries = NumberOfQueries();
int myTask = myid + 1;
while (myTask <= nqueries) {
int from = QueryFrom(myTask);
int to = QueryTo(myTask);
order = 0;
if (from != to) {
int iterator1 = FirstNeighbor(from);
int prev_iterator1 = from;
int iterator2 = SecondNeighbor(from);
int prev_iterator2 = from;
order = 1;
while (iterator1 != to && iterator2 != to) {
if (prev_iterator1 == FirstNeighbor(iterator1)) {
prev_iterator1 = iterator1;
iterator1 = SecondNeighbor(iterator1);
} else {
prev_iterator1 = iterator1;
iterator1 = FirstNeighbor(iterator1);
}
if (prev_iterator2 == FirstNeighbor(iterator2)) {
prev_iterator2 = iterator2;
iterator2 = SecondNeighbor(iterator2);
} else {
prev_iterator2 = iterator2;
iterator2 = FirstNeighbor(iterator2);
}
order++;
}
}
PutInt(0, myTask);
PutInt(0, order);
Send(0);
myTask += nnodes;
}
if (!myid && nqueries) {
for (int i = 0; i < nnodes; i++) {
int myTask = i + 1;
while (myTask <= nqueries) {
Receive(i);
int task = GetInt(i);
int value = GetInt(i);
answer[task] = value;
myTask += nnodes;
}
}
for (int i = 1; i <= nqueries; i++) {
printf("%d\n", answer[i]);
}
}
}
}
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include <cstdio> #include <cstdlib> #include "message.h" #include "kollib.h" #define N 25000001 int t[N]; int answer[201]; int main() { int myid = MyNodeId(); int nstudents = NumberOfStudents(); int order = 1; if (nstudents < N) { int iterator = 1; t[iterator] = order; iterator = FirstNeighbor(iterator); while (order < nstudents) { order++; t[iterator] = order; if (t[FirstNeighbor(iterator)]) { iterator = SecondNeighbor(iterator); } else { iterator = FirstNeighbor(iterator); } } int nqueries = NumberOfQueries(); for (int i = 1; i <= nqueries; i++) { int from = QueryFrom(i); int to = QueryTo(i); int minutes = t[to] - t[from]; if (minutes < 0) minutes *= -1; if (nstudents - minutes < minutes) { minutes = nstudents - minutes; } if (!myid && nqueries) { printf("%d\n", minutes); } } } else { int nnodes = NumberOfNodes(); int nqueries = NumberOfQueries(); int myTask = myid + 1; while (myTask <= nqueries) { int from = QueryFrom(myTask); int to = QueryTo(myTask); order = 0; if (from != to) { int iterator1 = FirstNeighbor(from); int prev_iterator1 = from; int iterator2 = SecondNeighbor(from); int prev_iterator2 = from; order = 1; while (iterator1 != to && iterator2 != to) { if (prev_iterator1 == FirstNeighbor(iterator1)) { prev_iterator1 = iterator1; iterator1 = SecondNeighbor(iterator1); } else { prev_iterator1 = iterator1; iterator1 = FirstNeighbor(iterator1); } if (prev_iterator2 == FirstNeighbor(iterator2)) { prev_iterator2 = iterator2; iterator2 = SecondNeighbor(iterator2); } else { prev_iterator2 = iterator2; iterator2 = FirstNeighbor(iterator2); } order++; } } PutInt(0, myTask); PutInt(0, order); Send(0); myTask += nnodes; } if (!myid && nqueries) { for (int i = 0; i < nnodes; i++) { int myTask = i + 1; while (myTask <= nqueries) { Receive(i); int task = GetInt(i); int value = GetInt(i); answer[task] = value; myTask += nnodes; } } for (int i = 1; i <= nqueries; i++) { printf("%d\n", answer[i]); } } } } |
English