#include <cstdlib> #include <iostream> #include <climits> #include "krazki.h" #include "message.h" #define GetIntCheck(node, i) if (GetInt(node) != i) return 13; #define DPutInt(node, i) PutInt(node, i) #define DGetIntCheck(node, i) GetIntCheck(node, i) // 200mb na dane na proces #define kradanekra 2500007 //#define kradanekra 4000 long long krakra[kradanekra]; // iteracja od gory do dolu, krok 1 long long krakrakra(int start, int c) { //printf("krakrakra %i %i\n", MyNodeId(), start); long long w = LLONG_MAX; for (int i = 0; i < c; i++) { w = std::min(HoleDiameter(start + i + 1), w); krakra[i] = w; } //printf("krakrakra finish %i\n", MyNodeId()); return w; } void ZABIJWSZYSTKO() { for (int i = 0; i < MyNodeId(); i++) { PutInt(i, 13); Send(i); } exit(0); } // iteracja od dolu do gory, wkladamy krazki, zwraca pare {ostatni krazek id, ostatni krazek y} int krakrakrakra(int start, int c, int numkrazka, long long minv) { //printf("krakrakrakra %i\n", MyNodeId()); int numkrazkow = NumberOfDiscs(); long long rozmszukk = DiscDiameter(numkrazka); if (rozmszukk > minv) return numkrazka; for (int i = c - 1; i >= 0; i--) { if (krakra[i] >= rozmszukk) { if (numkrazka >= numkrazkow) { // znalazlem odpowiedz! printf("%i\n", start + i + 1); ZABIJWSZYSTKO(); } numkrazka++; rozmszukk = DiscDiameter(numkrazka); if (rozmszukk > minv) return numkrazka; } } if (MyNodeId() == 0) { printf("0\n"); exit(0); } return numkrazka; } int main() { int mynode = MyNodeId(); int h = PipeHeight(); int usednodecount = (h + kradanekra - 1) / kradanekra; int start = MyNodeId() * kradanekra; if (start >= h) return 0; //printf("START %i/%i %i\n", start, h, MyNodeId()); int c = std::min(PipeHeight() - start, kradanekra); long long myminv = krakrakra(start, c); long long minv = LLONG_MAX; bool jestesmyOstatni = ((start + kradanekra) >= h); if (!jestesmyOstatni) { // nie jestesmy ostatni // wysylamy MinVal kolejnemu wezlow DPutInt(mynode + 1, 1337); PutLL(mynode + 1, myminv); Send(mynode + 1); //printf("%i sent MinVal to %i\n", mynode, mynode + 1); } if (MyNodeId() == 0) { if (jestesmyOstatni) { krakrakrakra(0, c, 1, LLONG_MAX); return 0; } // czekamy na innych int dostalemPotwierdzenia = 0; int najwK = 1; while (dostalemPotwierdzenia < usednodecount - 1) { int k = Receive(-1); GetIntCheck(k, 7); dostalemPotwierdzenia++; najwK = std::max(najwK, k); //printf("Got %i/%i confirmations [%i]\n", dostalemPotwierdzenia, usednodecount, k); } //printf("WE ARE READY!\n"); // jestesmy gotowi! // wydajemy komende START PutInt(najwK, 777); PutInt(najwK, 1); // numer krazka Send(najwK); } else { // czekamy na MinVal int k = Receive(-1); DGetIntCheck(k, 1337); minv = GetLL(k); //printf("Got MinVal!\n"); // jestesmy gotowi PutInt(0, 7); Send(0); } // czekamy na START int k = Receive(-1); int stan = GetInt(k); if (stan == 13) { // zabij sie return 0; } else if (stan == 777) { // policz int rez = krakrakrakra(start, c, GetInt(k), minv); PutInt(mynode - 1, 777); PutInt(mynode - 1, rez); // numer krazka Send(mynode - 1); } else { return -11; } 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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | #include <cstdlib> #include <iostream> #include <climits> #include "krazki.h" #include "message.h" #define GetIntCheck(node, i) if (GetInt(node) != i) return 13; #define DPutInt(node, i) PutInt(node, i) #define DGetIntCheck(node, i) GetIntCheck(node, i) // 200mb na dane na proces #define kradanekra 2500007 //#define kradanekra 4000 long long krakra[kradanekra]; // iteracja od gory do dolu, krok 1 long long krakrakra(int start, int c) { //printf("krakrakra %i %i\n", MyNodeId(), start); long long w = LLONG_MAX; for (int i = 0; i < c; i++) { w = std::min(HoleDiameter(start + i + 1), w); krakra[i] = w; } //printf("krakrakra finish %i\n", MyNodeId()); return w; } void ZABIJWSZYSTKO() { for (int i = 0; i < MyNodeId(); i++) { PutInt(i, 13); Send(i); } exit(0); } // iteracja od dolu do gory, wkladamy krazki, zwraca pare {ostatni krazek id, ostatni krazek y} int krakrakrakra(int start, int c, int numkrazka, long long minv) { //printf("krakrakrakra %i\n", MyNodeId()); int numkrazkow = NumberOfDiscs(); long long rozmszukk = DiscDiameter(numkrazka); if (rozmszukk > minv) return numkrazka; for (int i = c - 1; i >= 0; i--) { if (krakra[i] >= rozmszukk) { if (numkrazka >= numkrazkow) { // znalazlem odpowiedz! printf("%i\n", start + i + 1); ZABIJWSZYSTKO(); } numkrazka++; rozmszukk = DiscDiameter(numkrazka); if (rozmszukk > minv) return numkrazka; } } if (MyNodeId() == 0) { printf("0\n"); exit(0); } return numkrazka; } int main() { int mynode = MyNodeId(); int h = PipeHeight(); int usednodecount = (h + kradanekra - 1) / kradanekra; int start = MyNodeId() * kradanekra; if (start >= h) return 0; //printf("START %i/%i %i\n", start, h, MyNodeId()); int c = std::min(PipeHeight() - start, kradanekra); long long myminv = krakrakra(start, c); long long minv = LLONG_MAX; bool jestesmyOstatni = ((start + kradanekra) >= h); if (!jestesmyOstatni) { // nie jestesmy ostatni // wysylamy MinVal kolejnemu wezlow DPutInt(mynode + 1, 1337); PutLL(mynode + 1, myminv); Send(mynode + 1); //printf("%i sent MinVal to %i\n", mynode, mynode + 1); } if (MyNodeId() == 0) { if (jestesmyOstatni) { krakrakrakra(0, c, 1, LLONG_MAX); return 0; } // czekamy na innych int dostalemPotwierdzenia = 0; int najwK = 1; while (dostalemPotwierdzenia < usednodecount - 1) { int k = Receive(-1); GetIntCheck(k, 7); dostalemPotwierdzenia++; najwK = std::max(najwK, k); //printf("Got %i/%i confirmations [%i]\n", dostalemPotwierdzenia, usednodecount, k); } //printf("WE ARE READY!\n"); // jestesmy gotowi! // wydajemy komende START PutInt(najwK, 777); PutInt(najwK, 1); // numer krazka Send(najwK); } else { // czekamy na MinVal int k = Receive(-1); DGetIntCheck(k, 1337); minv = GetLL(k); //printf("Got MinVal!\n"); // jestesmy gotowi PutInt(0, 7); Send(0); } // czekamy na START int k = Receive(-1); int stan = GetInt(k); if (stan == 13) { // zabij sie return 0; } else if (stan == 777) { // policz int rez = krakrakrakra(start, c, GetInt(k), minv); PutInt(mynode - 1, 777); PutInt(mynode - 1, rez); // numer krazka Send(mynode - 1); } else { return -11; } return 0; } |