#include "kollib.h"
#include "message.h"
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
using namespace std;
map <int, int> maps, ms;
int n;
#define ZERO 1000000009
int brut_limit = //200000000;
0;
int licz;
bool brutuj = false;
int limit;
//int MyNodeId(){return 0;}
/*void lec(int pos, int par, int ileJeszcze){
if(ileJeszcze == limit)return;
// printf("jestem w %d, numer %d\n", pos, ileJeszcze);
int a, b;
a = FirstNeighbor(pos);
b = SecondNeighbor(pos);
if(maps.count(pos) != 0){
maps[pos] = ileJeszcze;
}
if(a != par)lec(a, pos, ileJeszcze + 1);
else lec(b, pos, ileJeszcze + 1);
}*/
void lec(int pos, int par, int ileJeszcze){
int a, b;
for(int i=ileJeszcze; i<=limit; i++){
a = FirstNeighbor(pos);
b = SecondNeighbor(pos);
if(maps.count(pos) != 0){
maps[pos] = i;
}
if(a != par){
par = pos;
pos = a;
}
else{
par = pos;
pos = b;
}
}
}
int wynikDla(int a){
if(a < 0)a = -a;
return min(a, n-a);
}
int main (){
//cout << "HEEEEEEEE" << endl;
//if(MyNodeId() == 0)printf("ELO");
n = NumberOfStudents();
int m = NumberOfQueries();
if(n <= brut_limit){
limit = n;
brutuj = true;
} else limit = n/2 + 1;
for(int i=1; i<=m; i++){
maps[QueryFrom(i)] = ZERO;
maps[QueryTo(i)] = ZERO;
}
int node = MyNodeId();
srand(1234);
int num = rand() % n + 1;
if(node == 0 || brutuj){
lec(num, SecondNeighbor(num), 0);
} else if(node == 1){
lec(num, FirstNeighbor(num), 0);
}
if(node == 1 && !brutuj){
for(int i=1; i<=m; i++){
PutInt(0, maps[QueryFrom(i)]);
PutInt(0, maps[QueryTo(i)]);
}
Send(0);
}
if(node == 0){
int a, b;
int odl = 0;
if(!brutuj)Receive(1);
for(int i=1; i<=m; i++){
a = ZERO;
b = ZERO;
if(!brutuj){
a = GetInt(1);
b = GetInt(1);
if(a != ZERO)a = n - a;
if(b != ZERO)b = n - b;
}
if(a == ZERO)a = maps[QueryFrom(i)];
if(b == ZERO)b = maps[QueryTo(i)];
// printf("przerobilem na %d %d\n", a, b);
if(QueryFrom(i) == QueryTo(i)){
printf("0\n");
} else
printf("%d\n", wynikDla(a - b));
}
}
}
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 | #include "kollib.h" #include "message.h" #include <algorithm> #include <cstdio> #include <iostream> #include <map> using namespace std; map <int, int> maps, ms; int n; #define ZERO 1000000009 int brut_limit = //200000000; 0; int licz; bool brutuj = false; int limit; //int MyNodeId(){return 0;} /*void lec(int pos, int par, int ileJeszcze){ if(ileJeszcze == limit)return; // printf("jestem w %d, numer %d\n", pos, ileJeszcze); int a, b; a = FirstNeighbor(pos); b = SecondNeighbor(pos); if(maps.count(pos) != 0){ maps[pos] = ileJeszcze; } if(a != par)lec(a, pos, ileJeszcze + 1); else lec(b, pos, ileJeszcze + 1); }*/ void lec(int pos, int par, int ileJeszcze){ int a, b; for(int i=ileJeszcze; i<=limit; i++){ a = FirstNeighbor(pos); b = SecondNeighbor(pos); if(maps.count(pos) != 0){ maps[pos] = i; } if(a != par){ par = pos; pos = a; } else{ par = pos; pos = b; } } } int wynikDla(int a){ if(a < 0)a = -a; return min(a, n-a); } int main (){ //cout << "HEEEEEEEE" << endl; //if(MyNodeId() == 0)printf("ELO"); n = NumberOfStudents(); int m = NumberOfQueries(); if(n <= brut_limit){ limit = n; brutuj = true; } else limit = n/2 + 1; for(int i=1; i<=m; i++){ maps[QueryFrom(i)] = ZERO; maps[QueryTo(i)] = ZERO; } int node = MyNodeId(); srand(1234); int num = rand() % n + 1; if(node == 0 || brutuj){ lec(num, SecondNeighbor(num), 0); } else if(node == 1){ lec(num, FirstNeighbor(num), 0); } if(node == 1 && !brutuj){ for(int i=1; i<=m; i++){ PutInt(0, maps[QueryFrom(i)]); PutInt(0, maps[QueryTo(i)]); } Send(0); } if(node == 0){ int a, b; int odl = 0; if(!brutuj)Receive(1); for(int i=1; i<=m; i++){ a = ZERO; b = ZERO; if(!brutuj){ a = GetInt(1); b = GetInt(1); if(a != ZERO)a = n - a; if(b != ZERO)b = n - b; } if(a == ZERO)a = maps[QueryFrom(i)]; if(b == ZERO)b = maps[QueryTo(i)]; // printf("przerobilem na %d %d\n", a, b); if(QueryFrom(i) == QueryTo(i)){ printf("0\n"); } else printf("%d\n", wynikDla(a - b)); } } } |
English