// 1 maszyna
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include "message.h"
/*
int NumberOfNodes();
int MyNodeId();
void PutInt(int target, int value);
void Send(int target);
int Receive(int source);
int GetInt(int src);
*/
#include "kollib.h"
/*
int NumberOfStudents();
int FirstNeighbor(int i);
int SecondNeighbor(int i);
int NumberOfQueries();
int QueryFrom(int i);
int QueryTo(int i);
*/
using namespace std;
struct query {
int from;
int to;
};
int main() {
if (MyNodeId()==0) {
int i,n,nq,start,prev,curr,first,val;
query q;
set<int>::iterator it;
set<int> qNodes;
map<int,int> fNodes;
vector<query> qs;
qs.clear(); qNodes.clear(); fNodes.clear();
n=NumberOfStudents();
nq=NumberOfQueries();
if (nq>0) {
for (i=1; i<=nq; i++) {
q.from=QueryFrom(i);
q.to=QueryTo(i);
qNodes.insert(q.from);
qNodes.insert(q.to);
qs.push_back(q);
}
it=qNodes.begin();
start=*it;
i=0;
qNodes.erase(it);
fNodes[start]=i;
prev=start;
curr=FirstNeighbor(start);
i++;
while (!qNodes.empty()) {
it=qNodes.find(curr);
if (it!=qNodes.end()) {
qNodes.erase(it);
fNodes[curr]=i;
}
first=FirstNeighbor(curr);
if (prev==first) {
prev=curr;
curr=SecondNeighbor(curr);
}
else {
prev=curr;
curr=first;
}
i++;
}
for (i=0; i<nq; i++) {
val=fNodes[qs[i].from]-fNodes[qs[i].to];
if (val<0) {
val = -1 * val;
}
if (val>n/2) {
val=n-val;
}
cout << val << endl;
}
}
}
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 | // 1 maszyna #include <iostream> #include <vector> #include <set> #include <map> #include "message.h" /* int NumberOfNodes(); int MyNodeId(); void PutInt(int target, int value); void Send(int target); int Receive(int source); int GetInt(int src); */ #include "kollib.h" /* int NumberOfStudents(); int FirstNeighbor(int i); int SecondNeighbor(int i); int NumberOfQueries(); int QueryFrom(int i); int QueryTo(int i); */ using namespace std; struct query { int from; int to; }; int main() { if (MyNodeId()==0) { int i,n,nq,start,prev,curr,first,val; query q; set<int>::iterator it; set<int> qNodes; map<int,int> fNodes; vector<query> qs; qs.clear(); qNodes.clear(); fNodes.clear(); n=NumberOfStudents(); nq=NumberOfQueries(); if (nq>0) { for (i=1; i<=nq; i++) { q.from=QueryFrom(i); q.to=QueryTo(i); qNodes.insert(q.from); qNodes.insert(q.to); qs.push_back(q); } it=qNodes.begin(); start=*it; i=0; qNodes.erase(it); fNodes[start]=i; prev=start; curr=FirstNeighbor(start); i++; while (!qNodes.empty()) { it=qNodes.find(curr); if (it!=qNodes.end()) { qNodes.erase(it); fNodes[curr]=i; } first=FirstNeighbor(curr); if (prev==first) { prev=curr; curr=SecondNeighbor(curr); } else { prev=curr; curr=first; } i++; } for (i=0; i<nq; i++) { val=fNodes[qs[i].from]-fNodes[qs[i].to]; if (val<0) { val = -1 * val; } if (val>n/2) { val=n-val; } cout << val << endl; } } } return 0; } |
English