#include "kollib.h"
#include "message.h"
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
void step(int &student, int &next) {
int fn = FirstNeighbor(next);
if(student == fn) {
student = next;
next = SecondNeighbor(next);
} else {
student = next;
next = fn;
}
}
int randInt(int const &a, int const &b) {
if(b < a) return randInt(b, a);
unsigned int r = rand() ^ (((unsigned int) rand()) << 16);
unsigned int l = 0xffffffff;
unsigned int m = b - a + 1;
if(r > (l / m) * m) {
return randInt(a, b);
} else {
return a + r % m;
}
}
int solve() {
srand(0xa50571fb);
set<int> requests;
int n = NumberOfStudents();
int q = NumberOfQueries();
for(int i = 1; i <= q; ++i) {
requests.insert(QueryFrom(i));
requests.insert(QueryTo(i));
}
int firstStudent = *(requests.begin());
{
int r = randInt(0, requests.size() - 1);
set<int>::iterator it = requests.begin();
for(int i = 0; i < r; ++i) {
++it;
}
firstStudent = *it;
}
map<int, int> positionOf;
positionOf[firstStudent] = 0;
int student = firstStudent;
int next = randInt(0, 1) ? FirstNeighbor(student) : SecondNeighbor(student);
int pos = 0;
int todo = requests.size() - 1;
while(todo) {
step(student, next);
++pos;
if(requests.find(student) != requests.end()) {
positionOf[student] = pos;
--todo;
}
}
for(int i = 1; i <= q; ++i) {
int p0 = positionOf[QueryFrom(i)];
int p1 = positionOf[QueryTo(i)];
int d = abs(p0 - p1);
d = min(d, n - d);
printf("%d\n", d);
}
return EXIT_SUCCESS;
}
int main() {
if(MyNodeId() == 0) {
solve();
} else {
fprintf(stderr, "Ojtam ojtam, jedna instancja da rade.\n");
}
return EXIT_SUCCESS;
}
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 | #include "kollib.h" #include "message.h" #include <cstdlib> #include <cstdio> #include <algorithm> #include <set> #include <map> using namespace std; void step(int &student, int &next) { int fn = FirstNeighbor(next); if(student == fn) { student = next; next = SecondNeighbor(next); } else { student = next; next = fn; } } int randInt(int const &a, int const &b) { if(b < a) return randInt(b, a); unsigned int r = rand() ^ (((unsigned int) rand()) << 16); unsigned int l = 0xffffffff; unsigned int m = b - a + 1; if(r > (l / m) * m) { return randInt(a, b); } else { return a + r % m; } } int solve() { srand(0xa50571fb); set<int> requests; int n = NumberOfStudents(); int q = NumberOfQueries(); for(int i = 1; i <= q; ++i) { requests.insert(QueryFrom(i)); requests.insert(QueryTo(i)); } int firstStudent = *(requests.begin()); { int r = randInt(0, requests.size() - 1); set<int>::iterator it = requests.begin(); for(int i = 0; i < r; ++i) { ++it; } firstStudent = *it; } map<int, int> positionOf; positionOf[firstStudent] = 0; int student = firstStudent; int next = randInt(0, 1) ? FirstNeighbor(student) : SecondNeighbor(student); int pos = 0; int todo = requests.size() - 1; while(todo) { step(student, next); ++pos; if(requests.find(student) != requests.end()) { positionOf[student] = pos; --todo; } } for(int i = 1; i <= q; ++i) { int p0 = positionOf[QueryFrom(i)]; int p1 = positionOf[QueryTo(i)]; int d = abs(p0 - p1); d = min(d, n - d); printf("%d\n", d); } return EXIT_SUCCESS; } int main() { if(MyNodeId() == 0) { solve(); } else { fprintf(stderr, "Ojtam ojtam, jedna instancja da rade.\n"); } return EXIT_SUCCESS; } |
English