#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include "krazki.h"
#include "message.h"
using std::vector;
int main() {
int N = NumberOfNodes();
int node = MyNodeId();
int n = PipeHeight();
int m = NumberOfDiscs();
int lenPerNode = n / N;
int start = lenPerNode * node;
int end = (node == N - 1) ? n : lenPerNode * (node + 1);
int size = end - start;
vector<long long> pipe((unsigned int) size);
long long int min = LONG_LONG_MAX;
for (int i = 0; i < size; i++) {
long long hole = HoleDiameter(start + i + 1);
min = std::min(hole, min);
pipe[i] = min;
}
// std::cout << "subpipe " << node << ": [";
// for (auto &item : pipe) {
// std::cout << item << "-";
// }
// std::cout << '\b' << "]" << std::endl;
int stack = 0;
bool (*comp)(const long long int &, const long long int &)=[](const long long int &k, const long long int &a) {
return k > a;
};
auto last = pipe.end();
for (int i = 0; i < m; i++) {
long long int kr = DiscDiameter(i + 1);
vector<long long int>::iterator it;
if (kr <= pipe[size - 1])
it = pipe.end();
else
it = std::upper_bound(pipe.begin(), last, kr, comp);
int idx;
if (it == pipe.end()) {
if (node == N-1)
idx = size;
else
continue;
} else {
idx = (int) (it - pipe.begin());
last = it;
}
stack = std::min(idx - size, stack) - 1;
}
if (node != 0) {
PutInt(0, -stack);
Send(0);
} else {
std::vector<int> all((unsigned long long)(N));
all[0] = -stack;
for (int i = 1; i < N; i++) {
const int src = Receive(-1);
all[src] = GetInt(src);
}
int max_stack = n;
int acc = 0;
for (int i = N - 1; i >= 0; i--) {
// std::cout << "subpipe len "<< i << ": "<< all[i] << std::endl;
int c_size = ((i == N - 1) ? n : lenPerNode * (i + 1)) - (lenPerNode * i);
int c_stack = all[i];
if (c_stack != 0) {
max_stack = std::min(max_stack, n - acc - c_stack);
// std::cout << "aprox len: " << (n - acc - c_stack) << std::endl;
}
acc += c_size;
}
std::cout << std::max(0, max_stack + 1) << std::endl;
}
}
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 | #include <iostream> #include <vector> #include <algorithm> #include <climits> #include "krazki.h" #include "message.h" using std::vector; int main() { int N = NumberOfNodes(); int node = MyNodeId(); int n = PipeHeight(); int m = NumberOfDiscs(); int lenPerNode = n / N; int start = lenPerNode * node; int end = (node == N - 1) ? n : lenPerNode * (node + 1); int size = end - start; vector<long long> pipe((unsigned int) size); long long int min = LONG_LONG_MAX; for (int i = 0; i < size; i++) { long long hole = HoleDiameter(start + i + 1); min = std::min(hole, min); pipe[i] = min; } // std::cout << "subpipe " << node << ": ["; // for (auto &item : pipe) { // std::cout << item << "-"; // } // std::cout << '\b' << "]" << std::endl; int stack = 0; bool (*comp)(const long long int &, const long long int &)=[](const long long int &k, const long long int &a) { return k > a; }; auto last = pipe.end(); for (int i = 0; i < m; i++) { long long int kr = DiscDiameter(i + 1); vector<long long int>::iterator it; if (kr <= pipe[size - 1]) it = pipe.end(); else it = std::upper_bound(pipe.begin(), last, kr, comp); int idx; if (it == pipe.end()) { if (node == N-1) idx = size; else continue; } else { idx = (int) (it - pipe.begin()); last = it; } stack = std::min(idx - size, stack) - 1; } if (node != 0) { PutInt(0, -stack); Send(0); } else { std::vector<int> all((unsigned long long)(N)); all[0] = -stack; for (int i = 1; i < N; i++) { const int src = Receive(-1); all[src] = GetInt(src); } int max_stack = n; int acc = 0; for (int i = N - 1; i >= 0; i--) { // std::cout << "subpipe len "<< i << ": "<< all[i] << std::endl; int c_size = ((i == N - 1) ? n : lenPerNode * (i + 1)) - (lenPerNode * i); int c_stack = all[i]; if (c_stack != 0) { max_stack = std::min(max_stack, n - acc - c_stack); // std::cout << "aprox len: " << (n - acc - c_stack) << std::endl; } acc += c_size; } std::cout << std::max(0, max_stack + 1) << std::endl; } } |
English