#include <cstdio> #include <message.h> #include "kollib.h" #include <algorithm> #include <vector> #include <utility> using namespace std; #define st first #define nd second #define make(a,b) make_pair(a,b) vector < pair<int,int> > jakie; int x; void szukaj( int a, int pre) { // printf("szukaj %d %d\n",a,pre); for (int i=1;i<=x;i++) { // printf("Wrzuc %d %d\n",MyNodeId(), a); jakie.push_back( make(a,i) ); if ( SecondNeighbor(a) == pre ) { pre = a; a = FirstNeighbor(a); } else { pre = a; a = SecondNeighbor(a); } } jakie.push_back( make( NumberOfStudents()+5, 0) ); /* if ( MyNodeId() + 2 < NumberOfNodes() ) { PutInt( MyNodeId() + 2, a ); PutInt( MyNodeId() + 2, pre ); Send( MyNodeId() + 2 ); } */ sort( jakie.begin(), jakie.end() ); } int main() { int n = NumberOfStudents(); int k = NumberOfNodes(); pair<int,int> z; pair<int,int> From; pair<int,int> To; int a,b; x = n; // if ( MyNodeId() == n-1 ) x = n - (n/k)*(k-1); // if ( MyNodeId() / 2 == 0 ) // { if ( MyNodeId() == 0 ) szukaj(1, 0); // else szukaj( FirstNeighbor(1), 1 ); // } /*/ else { Receive( MyNodeId() - 2 ); a = GetInt( MyNodeId() - 2 ); b = GetInt( MyNodeId() - 2 ); szukaj( a,b ); } */ if ( MyNodeId() == 0 ) { // for (int i=1;i<k;i++) Receive(i); for (int i=1;i<=NumberOfQueries();i++) { z = *lower_bound( jakie.begin(), jakie.end(), make( QueryFrom(i), 0 ) ); if (z.st == QueryFrom(i) ) From = make( 0, z.nd ); z = *lower_bound( jakie.begin(), jakie.end(), make( QueryTo(i), 0 ) ); if (z.st == QueryTo(i) ) To = make( 0, z.nd ); /* for (int t = 1; t < k ; t++ ) { a = GetInt(t); b = GetInt(t); if ( a ) From = make( t, a ); if ( b ) To = make( t, b ); } // printf("From %d %d To %d %d\n", From.st, From.nd, To.st, To.nd ); */ if ( To.st%2 == From.st%2 ) { a = abs( To.nd - From.nd + ( To.st/2 - From.st/2)*x ) ; printf("%d\n", min(a, n-a) ); } else { a = To.nd + From.nd + (To.st/2 + From.st/2)*x -1; printf("%d\n", min(a , n-a) ); } } } /* else { for (int i=1;i<=NumberOfQueries();i++) { z = *lower_bound( jakie.begin(), jakie.end(), make( QueryFrom(i), 0 ) ); // printf("Wyslij %d %d ", MyNodeId(), i); if ( z.st != QueryFrom(i) ) { PutInt(0,0); // printf("0 "); } else { PutInt(0, z.nd); // printf("%d ",z.nd); } z = *lower_bound( jakie.begin(), jakie.end(), make( QueryTo(i), 0 ) ); if ( z.st != QueryTo(i) ) { PutInt(0,0); // printf("0 "); } else { PutInt(0, z.nd); // printf("%d ",z.nd); } // printf("\n"); } Send( 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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <cstdio> #include <message.h> #include "kollib.h" #include <algorithm> #include <vector> #include <utility> using namespace std; #define st first #define nd second #define make(a,b) make_pair(a,b) vector < pair<int,int> > jakie; int x; void szukaj( int a, int pre) { // printf("szukaj %d %d\n",a,pre); for (int i=1;i<=x;i++) { // printf("Wrzuc %d %d\n",MyNodeId(), a); jakie.push_back( make(a,i) ); if ( SecondNeighbor(a) == pre ) { pre = a; a = FirstNeighbor(a); } else { pre = a; a = SecondNeighbor(a); } } jakie.push_back( make( NumberOfStudents()+5, 0) ); /* if ( MyNodeId() + 2 < NumberOfNodes() ) { PutInt( MyNodeId() + 2, a ); PutInt( MyNodeId() + 2, pre ); Send( MyNodeId() + 2 ); } */ sort( jakie.begin(), jakie.end() ); } int main() { int n = NumberOfStudents(); int k = NumberOfNodes(); pair<int,int> z; pair<int,int> From; pair<int,int> To; int a,b; x = n; // if ( MyNodeId() == n-1 ) x = n - (n/k)*(k-1); // if ( MyNodeId() / 2 == 0 ) // { if ( MyNodeId() == 0 ) szukaj(1, 0); // else szukaj( FirstNeighbor(1), 1 ); // } /*/ else { Receive( MyNodeId() - 2 ); a = GetInt( MyNodeId() - 2 ); b = GetInt( MyNodeId() - 2 ); szukaj( a,b ); } */ if ( MyNodeId() == 0 ) { // for (int i=1;i<k;i++) Receive(i); for (int i=1;i<=NumberOfQueries();i++) { z = *lower_bound( jakie.begin(), jakie.end(), make( QueryFrom(i), 0 ) ); if (z.st == QueryFrom(i) ) From = make( 0, z.nd ); z = *lower_bound( jakie.begin(), jakie.end(), make( QueryTo(i), 0 ) ); if (z.st == QueryTo(i) ) To = make( 0, z.nd ); /* for (int t = 1; t < k ; t++ ) { a = GetInt(t); b = GetInt(t); if ( a ) From = make( t, a ); if ( b ) To = make( t, b ); } // printf("From %d %d To %d %d\n", From.st, From.nd, To.st, To.nd ); */ if ( To.st%2 == From.st%2 ) { a = abs( To.nd - From.nd + ( To.st/2 - From.st/2)*x ) ; printf("%d\n", min(a, n-a) ); } else { a = To.nd + From.nd + (To.st/2 + From.st/2)*x -1; printf("%d\n", min(a , n-a) ); } } } /* else { for (int i=1;i<=NumberOfQueries();i++) { z = *lower_bound( jakie.begin(), jakie.end(), make( QueryFrom(i), 0 ) ); // printf("Wyslij %d %d ", MyNodeId(), i); if ( z.st != QueryFrom(i) ) { PutInt(0,0); // printf("0 "); } else { PutInt(0, z.nd); // printf("%d ",z.nd); } z = *lower_bound( jakie.begin(), jakie.end(), make( QueryTo(i), 0 ) ); if ( z.st != QueryTo(i) ) { PutInt(0,0); // printf("0 "); } else { PutInt(0, z.nd); // printf("%d ",z.nd); } // printf("\n"); } Send( 0 ); }*/ } |