#include <algorithm>
#include <vector>
#include <cstdio>
#include "krazki.h"
#include "message.h"
const long long MAX = 1000000000000000050LL;
using namespace std;
int main() {
int non = NumberOfNodes();
int myid = MyNodeId();
int ph = PipeHeight();
int per_node = ph / non + 1;
int nod = NumberOfDiscs();
vector <long long> pipe;
int start = myid * per_node + 1;
int end = (myid + 1) * per_node + 1;
for(int i = start; i < end; ++i) {
if(i <= ph) {
pipe.push_back(HoleDiameter(i));
}
}
long long act = MAX;
for(int i = 0; i < pipe.size(); ++i) {
act = min(act, pipe[i]);
pipe[i] = act;
}
for(int i = myid + 1; i < non; ++i) {
PutLL(i, act);
Send(i);
}
long long n_act = MAX;
for(int i = 0; i < myid; ++i) {
Receive(i);
n_act = min(n_act, GetLL(i));
}
for(int i = 0; i < pipe.size(); ++i) {
pipe[i] = min(pipe[i], n_act);
}
int curr;
int result = -1;
if(myid == non - 1) {
curr = 1;
for(int i = pipe.size() - 1; i >= 0; --i) {
if(curr <= nod and pipe[i] >= DiscDiameter(curr)) ++curr;
if(curr > nod) {
result = myid * per_node + i + 1;
break;
}
}
if(result != -1) {
printf("%d\n", result);
}
PutInt(myid - 1, curr);
Send(myid - 1);
} else {
Receive(myid + 1);
curr = GetInt(myid + 1);
if(curr <= nod) {
for(int i = pipe.size() - 1; i >= 0; --i) {
if(curr <= nod and pipe[i] >= DiscDiameter(curr)) ++curr;
if(curr > nod) {
result = myid * per_node + i + 1;
break;
}
}
}
if(result != -1) {
printf("%d\n", result);
} else if(myid == 0 and curr <= nod) {
printf("0\n");
}
if(myid > 0) {
PutInt(myid - 1, curr);
Send(myid - 1);
}
}
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 | #include <algorithm> #include <vector> #include <cstdio> #include "krazki.h" #include "message.h" const long long MAX = 1000000000000000050LL; using namespace std; int main() { int non = NumberOfNodes(); int myid = MyNodeId(); int ph = PipeHeight(); int per_node = ph / non + 1; int nod = NumberOfDiscs(); vector <long long> pipe; int start = myid * per_node + 1; int end = (myid + 1) * per_node + 1; for(int i = start; i < end; ++i) { if(i <= ph) { pipe.push_back(HoleDiameter(i)); } } long long act = MAX; for(int i = 0; i < pipe.size(); ++i) { act = min(act, pipe[i]); pipe[i] = act; } for(int i = myid + 1; i < non; ++i) { PutLL(i, act); Send(i); } long long n_act = MAX; for(int i = 0; i < myid; ++i) { Receive(i); n_act = min(n_act, GetLL(i)); } for(int i = 0; i < pipe.size(); ++i) { pipe[i] = min(pipe[i], n_act); } int curr; int result = -1; if(myid == non - 1) { curr = 1; for(int i = pipe.size() - 1; i >= 0; --i) { if(curr <= nod and pipe[i] >= DiscDiameter(curr)) ++curr; if(curr > nod) { result = myid * per_node + i + 1; break; } } if(result != -1) { printf("%d\n", result); } PutInt(myid - 1, curr); Send(myid - 1); } else { Receive(myid + 1); curr = GetInt(myid + 1); if(curr <= nod) { for(int i = pipe.size() - 1; i >= 0; --i) { if(curr <= nod and pipe[i] >= DiscDiameter(curr)) ++curr; if(curr > nod) { result = myid * per_node + i + 1; break; } } } if(result != -1) { printf("%d\n", result); } else if(myid == 0 and curr <= nod) { printf("0\n"); } if(myid > 0) { PutInt(myid - 1, curr); Send(myid - 1); } } return 0; } |
English