#include <iostream>
#include <set>
#include "message.h"
#include "kollib.h"
using namespace std;
int qp[400];
struct db { int x, p; };
bool operator< (db a, db b) {
return a.x < b.x;
}
set<db> s;
int nextStudent(int x, int pr) {
int y = FirstNeighbor(x);
if (pr == y) {
return SecondNeighbor(x);
} else {
return y;
}
}
int main() {
ios_base::sync_with_stdio(0);
int id = MyNodeId();
int n = NumberOfStudents();
int m = NumberOfQueries();
if (id == 0) {
db tmp;
pair<set<db>::iterator, bool> insr;
for (int i = 0; i < m; i++) {
tmp.x = QueryFrom(i+1);
tmp.p = i*2;
insr = s.insert(tmp);
if (!insr.second) {
qp[i*2] = -(insr.first->p) - 1;
}
tmp.x = QueryTo(i+1);
tmp.p = i*2+1;
insr = s.insert(tmp);
if (!insr.second) {
qp[i*2+1] = -(insr.first->p) - 1;
}
}
int cs = 1, ps = SecondNeighbor(1);
set<db>::iterator it;
for (int i = 0; i < n; i++) {
tmp.x = nextStudent(cs, ps);
ps = cs;
cs = tmp.x;
it = s.find(tmp);
if (it != s.end()) {
qp[it->p] = i;
}
}
int diff, cqa, cqb;
for (int i = 0; i < m; i++) {
cqa = qp[i*2];
if (cqa < 0) { cqa = qp[-cqa - 1]; }
cqb = qp[i*2+1];
if (cqb < 0) { cqb = qp[-cqb - 1]; }
diff = cqa - cqb;
if (diff < 0)
diff = -diff;
cout << min(diff, n - diff) << 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 | #include <iostream> #include <set> #include "message.h" #include "kollib.h" using namespace std; int qp[400]; struct db { int x, p; }; bool operator< (db a, db b) { return a.x < b.x; } set<db> s; int nextStudent(int x, int pr) { int y = FirstNeighbor(x); if (pr == y) { return SecondNeighbor(x); } else { return y; } } int main() { ios_base::sync_with_stdio(0); int id = MyNodeId(); int n = NumberOfStudents(); int m = NumberOfQueries(); if (id == 0) { db tmp; pair<set<db>::iterator, bool> insr; for (int i = 0; i < m; i++) { tmp.x = QueryFrom(i+1); tmp.p = i*2; insr = s.insert(tmp); if (!insr.second) { qp[i*2] = -(insr.first->p) - 1; } tmp.x = QueryTo(i+1); tmp.p = i*2+1; insr = s.insert(tmp); if (!insr.second) { qp[i*2+1] = -(insr.first->p) - 1; } } int cs = 1, ps = SecondNeighbor(1); set<db>::iterator it; for (int i = 0; i < n; i++) { tmp.x = nextStudent(cs, ps); ps = cs; cs = tmp.x; it = s.find(tmp); if (it != s.end()) { qp[it->p] = i; } } int diff, cqa, cqb; for (int i = 0; i < m; i++) { cqa = qp[i*2]; if (cqa < 0) { cqa = qp[-cqa - 1]; } cqb = qp[i*2+1]; if (cqb < 0) { cqb = qp[-cqb - 1]; } diff = cqa - cqb; if (diff < 0) diff = -diff; cout << min(diff, n - diff) << endl; } } return 0; } |
English