#define NDEBUG #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <limits> #include <climits> #include <map> #include <set> #include <vector> #include <cassert> #include "message.h" #include "kollib.h" const long long LLMAX = (std::numeric_limits<long long>()).max(); const long long LLMIN = (std::numeric_limits<long long>()).min(); const int None = -1; const int MaxResultsLen = 200; int results[MaxResultsLen]; int main() { std::ios_base::sync_with_stdio(false); int numberOfNodes = NumberOfNodes(); int myId = MyNodeId(); int numberOfStudents = NumberOfStudents(); int numberOfQueries = NumberOfQueries(); for (int i=1+myId; i <= numberOfQueries; i+=numberOfNodes) { int from = QueryFrom(i); int to = QueryTo(i); int prev = None; int curr = from; int count = 0; while (curr != to) { int next = FirstNeighbor(curr); if (next == prev) { next = SecondNeighbor(curr); } prev = curr; curr = next; ++count; } if (count > numberOfStudents / 2) { count = numberOfStudents - count; } PutInt(0, i); PutInt(0, count); Send(0); } if (myId == 0) { for (int i=0; i < numberOfQueries; ++i) { int inst = Receive(-1); int q = GetInt(inst); int count = GetInt(inst); results[q - 1] = count; } for (int i=0; i < numberOfQueries; ++i) { printf("%d\n", results[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 | #define NDEBUG #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <limits> #include <climits> #include <map> #include <set> #include <vector> #include <cassert> #include "message.h" #include "kollib.h" const long long LLMAX = (std::numeric_limits<long long>()).max(); const long long LLMIN = (std::numeric_limits<long long>()).min(); const int None = -1; const int MaxResultsLen = 200; int results[MaxResultsLen]; int main() { std::ios_base::sync_with_stdio(false); int numberOfNodes = NumberOfNodes(); int myId = MyNodeId(); int numberOfStudents = NumberOfStudents(); int numberOfQueries = NumberOfQueries(); for (int i=1+myId; i <= numberOfQueries; i+=numberOfNodes) { int from = QueryFrom(i); int to = QueryTo(i); int prev = None; int curr = from; int count = 0; while (curr != to) { int next = FirstNeighbor(curr); if (next == prev) { next = SecondNeighbor(curr); } prev = curr; curr = next; ++count; } if (count > numberOfStudents / 2) { count = numberOfStudents - count; } PutInt(0, i); PutInt(0, count); Send(0); } if (myId == 0) { for (int i=0; i < numberOfQueries; ++i) { int inst = Receive(-1); int q = GetInt(inst); int count = GetInt(inst); results[q - 1] = count; } for (int i=0; i < numberOfQueries; ++i) { printf("%d\n", results[i]); } } } |