#include "kollib.h"
#include <cstdio>
#include "message.h"
#include <vector>
#include <map>
using namespace std;
int main() {
/* for (int i = 1; i <= NumberOfQueries(); ++i) {
if (QueryFrom(i) == QueryTo(i))
cout << 0 << endl;
else if (QueryTo(i) == FirstNeighbor(QueryFrom(i)) || QueryTo(i) == SecondNeighbor(QueryFrom(i)))
cout << 1 << endl;
else
cout << 2 << endl;
}
*/
int inst = MyNodeId();
int lens[NumberOfNodes()+2];
if (inst ==0){
int len = NumberOfStudents()/NumberOfNodes() + (NumberOfStudents()%NumberOfNodes()>0 ? 1 : 0);
//printf("len: %d\n", len);
int last = -1, pos = 1, t = -1;
if (len<3) len = 3;
int a = 1, nodeid = 0;
PutInt(nodeid, pos);
for (int i=0;i<NumberOfStudents();i++) {
if (last != FirstNeighbor(pos)) t = FirstNeighbor(pos); else t = SecondNeighbor(pos);
last = pos; pos = t;
if (a < 2) PutInt(nodeid, pos);
a++;
if (len == a) {PutInt(nodeid, a); lens[nodeid]=a; a = 0; Send(nodeid);nodeid++;}
}
if (a>1) {PutInt(nodeid, a-1); lens[nodeid] = a-1; a = 0; Send(nodeid); nodeid++;}
for (int j=nodeid;j<NumberOfNodes();j++) {lens[j] = 0; PutInt(j, 0); PutInt(j, 0); PutInt(j, 0); Send(j);}
} // nodeid 0 chodzenie
Receive(0);
int start = GetInt(0);
int next = GetInt(0);
int len = GetInt(0);
//printf("otrzymano %d: %d %d %d\n", inst, start, next, len);
if (len==0) return 0;
int last = start; int pos = next; int t=-1;
vector<int> v;
v.push_back(last); v.push_back(pos);
for (int i=0;i<len-2;i++) {
if (last != FirstNeighbor(pos)) t = FirstNeighbor(pos); else t = SecondNeighbor(pos);
last = pos; pos = t;
v.push_back(pos);
}
//printf("v %d: ", inst);for (int i=0;i<v.size();i++) printf("%d ", v[i]); printf("\n");
map<int, int> mapa;
for(int i=0;i<v.size();i++) mapa[v[i]] = i;
int result[NumberOfQueries()+3];
for(int i=1;i<=NumberOfQueries();i++) {
if (mapa.find(QueryFrom(i)) != mapa.end() && mapa.find(QueryTo(i)) != mapa.end())
{result[i] = mapa[QueryTo(i)] - mapa[QueryFrom(i)]; if (result[i]<0) result[i]=-result[i];}
else if (mapa.find(QueryFrom(i)) != mapa.end()) {result[i] = len-mapa[QueryFrom(i)];}
else if (mapa.find(QueryTo(i)) != mapa.end()) {result[i] = -mapa[QueryTo(i)]-1;}
else result[i] = 0;
}
//printf("Result %d: ", inst); for (int i=1;i<=NumberOfQueries();i++) printf("%d ", result[i]); printf("\n");
for (int i=1;i<=NumberOfQueries();i++){
PutInt(0, i);
PutInt(0, result[i]);
Send(0);
}
if (inst == 0) {
int matka[NumberOfNodes()+15][NumberOfQueries()+15];
for (int i=0;i<NumberOfNodes();i++) {
//printf("Getting %d...\n", i);
for (int q=0;q<NumberOfQueries();q++)
if (lens[i]==0) matka[i][q+1]=0;
else{Receive(i);
int query = GetInt(i);
int v = GetInt(i);
matka[i][query] = v;}
}
//for (int i=0;i<NumberOfNodes();i++) {for (int q=1;q<=NumberOfQueries();q++) printf("%d ", matka[i][q]); printf(" | %d\n", lens[i]);}
for (int q=1;q<=NumberOfQueries();q++) {
int result = 0, t=0;
for (int n=0;n<NumberOfNodes();n++)
if (matka[n][q]>0 && result == 0) result = matka[n][q];
else if (matka[n][q] == 0 && result>0) t += lens[n];
else if (matka[n][q]<0 && result>0) result += t - matka[n][q] -1 ;
else if (matka[n][q]<0 && result==0) result = lens[n] + matka[n][q] +1;
else if (matka[n][q]>0 && result>0) result += t + lens[n] - matka[n][q];
printf("%d\n", min(result, NumberOfStudents()-result));
//printf("%d\n", result);
}
}
/*for (int i=0;i<NumberOfQueries();i++) {printf("%d\n", tmp[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 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 | #include "kollib.h" #include <cstdio> #include "message.h" #include <vector> #include <map> using namespace std; int main() { /* for (int i = 1; i <= NumberOfQueries(); ++i) { if (QueryFrom(i) == QueryTo(i)) cout << 0 << endl; else if (QueryTo(i) == FirstNeighbor(QueryFrom(i)) || QueryTo(i) == SecondNeighbor(QueryFrom(i))) cout << 1 << endl; else cout << 2 << endl; } */ int inst = MyNodeId(); int lens[NumberOfNodes()+2]; if (inst ==0){ int len = NumberOfStudents()/NumberOfNodes() + (NumberOfStudents()%NumberOfNodes()>0 ? 1 : 0); //printf("len: %d\n", len); int last = -1, pos = 1, t = -1; if (len<3) len = 3; int a = 1, nodeid = 0; PutInt(nodeid, pos); for (int i=0;i<NumberOfStudents();i++) { if (last != FirstNeighbor(pos)) t = FirstNeighbor(pos); else t = SecondNeighbor(pos); last = pos; pos = t; if (a < 2) PutInt(nodeid, pos); a++; if (len == a) {PutInt(nodeid, a); lens[nodeid]=a; a = 0; Send(nodeid);nodeid++;} } if (a>1) {PutInt(nodeid, a-1); lens[nodeid] = a-1; a = 0; Send(nodeid); nodeid++;} for (int j=nodeid;j<NumberOfNodes();j++) {lens[j] = 0; PutInt(j, 0); PutInt(j, 0); PutInt(j, 0); Send(j);} } // nodeid 0 chodzenie Receive(0); int start = GetInt(0); int next = GetInt(0); int len = GetInt(0); //printf("otrzymano %d: %d %d %d\n", inst, start, next, len); if (len==0) return 0; int last = start; int pos = next; int t=-1; vector<int> v; v.push_back(last); v.push_back(pos); for (int i=0;i<len-2;i++) { if (last != FirstNeighbor(pos)) t = FirstNeighbor(pos); else t = SecondNeighbor(pos); last = pos; pos = t; v.push_back(pos); } //printf("v %d: ", inst);for (int i=0;i<v.size();i++) printf("%d ", v[i]); printf("\n"); map<int, int> mapa; for(int i=0;i<v.size();i++) mapa[v[i]] = i; int result[NumberOfQueries()+3]; for(int i=1;i<=NumberOfQueries();i++) { if (mapa.find(QueryFrom(i)) != mapa.end() && mapa.find(QueryTo(i)) != mapa.end()) {result[i] = mapa[QueryTo(i)] - mapa[QueryFrom(i)]; if (result[i]<0) result[i]=-result[i];} else if (mapa.find(QueryFrom(i)) != mapa.end()) {result[i] = len-mapa[QueryFrom(i)];} else if (mapa.find(QueryTo(i)) != mapa.end()) {result[i] = -mapa[QueryTo(i)]-1;} else result[i] = 0; } //printf("Result %d: ", inst); for (int i=1;i<=NumberOfQueries();i++) printf("%d ", result[i]); printf("\n"); for (int i=1;i<=NumberOfQueries();i++){ PutInt(0, i); PutInt(0, result[i]); Send(0); } if (inst == 0) { int matka[NumberOfNodes()+15][NumberOfQueries()+15]; for (int i=0;i<NumberOfNodes();i++) { //printf("Getting %d...\n", i); for (int q=0;q<NumberOfQueries();q++) if (lens[i]==0) matka[i][q+1]=0; else{Receive(i); int query = GetInt(i); int v = GetInt(i); matka[i][query] = v;} } //for (int i=0;i<NumberOfNodes();i++) {for (int q=1;q<=NumberOfQueries();q++) printf("%d ", matka[i][q]); printf(" | %d\n", lens[i]);} for (int q=1;q<=NumberOfQueries();q++) { int result = 0, t=0; for (int n=0;n<NumberOfNodes();n++) if (matka[n][q]>0 && result == 0) result = matka[n][q]; else if (matka[n][q] == 0 && result>0) t += lens[n]; else if (matka[n][q]<0 && result>0) result += t - matka[n][q] -1 ; else if (matka[n][q]<0 && result==0) result = lens[n] + matka[n][q] +1; else if (matka[n][q]>0 && result>0) result += t + lens[n] - matka[n][q]; printf("%d\n", min(result, NumberOfStudents()-result)); //printf("%d\n", result); } } /*for (int i=0;i<NumberOfQueries();i++) {printf("%d\n", tmp[i]);}}*/ return 0; } |
English