#include <cstdio> #include <algorithm> #include "krazki.h" #include "message.h" using namespace std; const int MAX_PIPES = 4*1000006; const long long INF_D = 1000000000000000018LL; const int INF_BOT = 4*100000008; long long min_pipe[MAX_PIPES]; int disc_n; int pipe_h; int node_n; int my_node; void countMin(int top, int bot) { long long curr_min = INF_D; for(int i = top; i <= bot; ++i) { curr_min = min(HoleDiameter(i), curr_min); min_pipe[i-top] = curr_min; } } int topLevel(int top, int bot) { int disc = 1; int level = bot; if(top > bot) return INF_BOT; for(; disc <= disc_n; ) { if(level - top > 0 && DiscDiameter(disc) > min_pipe[level-top]) --level; else { ++disc; if(level != bot) level--; } } if(level == bot) return INF_BOT; return level+1; // bo level wskazuje pierwszą wolną pozycję } int main() { node_n = NumberOfNodes(); my_node = MyNodeId(); disc_n = NumberOfDiscs(); pipe_h = PipeHeight(); int my_top, my_bot; my_top = (pipe_h / node_n) * my_node +1; my_bot = my_top + (pipe_h / node_n) - 1; if(my_node == node_n - 1) my_bot = pipe_h; countMin(my_top, my_bot); int res = topLevel(my_top, my_bot)+1; // +1 bo tutaj iterujemy od 1 if(my_node == 0) { int node_res[node_n]; node_res[0] = res; for(int i = 1; i < node_n; ++i) { Receive(i); node_res[i] = GetInt(i); } res = pipe_h - disc_n + 1; for(int i = 0; i < node_n; ++i) res = min(res, node_res[i]); if(res < 0) res = 0; printf("%d\n", res); } else { PutInt(0, res); Send(0); } 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 90 91 92 93 94 95 96 97 98 | #include <cstdio> #include <algorithm> #include "krazki.h" #include "message.h" using namespace std; const int MAX_PIPES = 4*1000006; const long long INF_D = 1000000000000000018LL; const int INF_BOT = 4*100000008; long long min_pipe[MAX_PIPES]; int disc_n; int pipe_h; int node_n; int my_node; void countMin(int top, int bot) { long long curr_min = INF_D; for(int i = top; i <= bot; ++i) { curr_min = min(HoleDiameter(i), curr_min); min_pipe[i-top] = curr_min; } } int topLevel(int top, int bot) { int disc = 1; int level = bot; if(top > bot) return INF_BOT; for(; disc <= disc_n; ) { if(level - top > 0 && DiscDiameter(disc) > min_pipe[level-top]) --level; else { ++disc; if(level != bot) level--; } } if(level == bot) return INF_BOT; return level+1; // bo level wskazuje pierwszą wolną pozycję } int main() { node_n = NumberOfNodes(); my_node = MyNodeId(); disc_n = NumberOfDiscs(); pipe_h = PipeHeight(); int my_top, my_bot; my_top = (pipe_h / node_n) * my_node +1; my_bot = my_top + (pipe_h / node_n) - 1; if(my_node == node_n - 1) my_bot = pipe_h; countMin(my_top, my_bot); int res = topLevel(my_top, my_bot)+1; // +1 bo tutaj iterujemy od 1 if(my_node == 0) { int node_res[node_n]; node_res[0] = res; for(int i = 1; i < node_n; ++i) { Receive(i); node_res[i] = GetInt(i); } res = pipe_h - disc_n + 1; for(int i = 0; i < node_n; ++i) res = min(res, node_res[i]); if(res < 0) res = 0; printf("%d\n", res); } else { PutInt(0, res); Send(0); } return 0; } |