#include "kanapka.h" #include "message.h" #include <iostream> #include <algorithm> using namespace std; typedef long long LL; //#define DEBUG int main() { long long N = GetN(); // Faza pierwsza. long long poczatek = (MyNodeId() * N) / NumberOfNodes(); long long koniec = ((MyNodeId() + 1) * N) / NumberOfNodes(); LL sl = 0, akt_max = 0, b = 0, maxb = 0, sum = 0, minsl = 0, maxsl = 0; for (long long i = poczatek; i < koniec; ++i) { long long kolejna = GetTaste(i); sl += kolejna; if (i == poczatek) { akt_max = sl; maxsl = sl; minsl = sl; } else { akt_max = max(akt_max, sl); maxsl = max(maxsl, sl); minsl = min(minsl, sl); } b = akt_max - sl; maxb = max(maxb, b); } sum = sl; if (MyNodeId() > 0) { PutLL(0, maxb); PutLL(0, sum); PutLL(0, minsl); PutLL(0, maxsl); Send(0); } else { LL maxmaxb = 0, sumsum = 0, maxslpl = 0, minslpl = 0, poprz_best_maxslpl = 0, c = 0, maxc = 0; sumsum = sum; maxslpl = maxsl; minslpl = minsl; poprz_best_maxslpl = 0; c = 0; maxc = 0; maxmaxb = maxb; #ifdef DEBUG fprintf(stderr, "0: maxb = %lld, sum = %lld, minsl = %lld, maxsl = %lld\n", maxb, sum, minsl, maxsl); #endif for (int i = 1; i < NumberOfNodes(); ++i) { int instancja = Receive(i); maxb = GetLL(instancja); sum = GetLL(instancja); minsl = GetLL(instancja); maxsl = GetLL(instancja); #ifdef DEBUG fprintf(stderr, "%d: maxb = %lld, sum = %lld, minsl = %lld, maxsl = %lld\n", instancja, maxb, sum, minsl, maxsl); #endif poprz_best_maxslpl = max(poprz_best_maxslpl, maxslpl); maxslpl = sumsum + maxsl; minslpl = sumsum + minsl; sumsum += sum; c = poprz_best_maxslpl - minslpl; maxc = max(maxc, c); maxmaxb = max(maxmaxb, maxb); #ifdef DEBUG fprintf(stderr, " poprz = %lld, sumsum = %lld, maxslpl = %lld, minslpl = %lld, c = %lld, maxc = %lld, maxmaxb = %lld\n", poprz_best_maxslpl, sumsum, maxslpl, minslpl, c, maxc, maxmaxb); #endif } printf("%lld\n", max(0LL, sumsum + max(maxmaxb, maxc))); } 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 | #include "kanapka.h" #include "message.h" #include <iostream> #include <algorithm> using namespace std; typedef long long LL; //#define DEBUG int main() { long long N = GetN(); // Faza pierwsza. long long poczatek = (MyNodeId() * N) / NumberOfNodes(); long long koniec = ((MyNodeId() + 1) * N) / NumberOfNodes(); LL sl = 0, akt_max = 0, b = 0, maxb = 0, sum = 0, minsl = 0, maxsl = 0; for (long long i = poczatek; i < koniec; ++i) { long long kolejna = GetTaste(i); sl += kolejna; if (i == poczatek) { akt_max = sl; maxsl = sl; minsl = sl; } else { akt_max = max(akt_max, sl); maxsl = max(maxsl, sl); minsl = min(minsl, sl); } b = akt_max - sl; maxb = max(maxb, b); } sum = sl; if (MyNodeId() > 0) { PutLL(0, maxb); PutLL(0, sum); PutLL(0, minsl); PutLL(0, maxsl); Send(0); } else { LL maxmaxb = 0, sumsum = 0, maxslpl = 0, minslpl = 0, poprz_best_maxslpl = 0, c = 0, maxc = 0; sumsum = sum; maxslpl = maxsl; minslpl = minsl; poprz_best_maxslpl = 0; c = 0; maxc = 0; maxmaxb = maxb; #ifdef DEBUG fprintf(stderr, "0: maxb = %lld, sum = %lld, minsl = %lld, maxsl = %lld\n", maxb, sum, minsl, maxsl); #endif for (int i = 1; i < NumberOfNodes(); ++i) { int instancja = Receive(i); maxb = GetLL(instancja); sum = GetLL(instancja); minsl = GetLL(instancja); maxsl = GetLL(instancja); #ifdef DEBUG fprintf(stderr, "%d: maxb = %lld, sum = %lld, minsl = %lld, maxsl = %lld\n", instancja, maxb, sum, minsl, maxsl); #endif poprz_best_maxslpl = max(poprz_best_maxslpl, maxslpl); maxslpl = sumsum + maxsl; minslpl = sumsum + minsl; sumsum += sum; c = poprz_best_maxslpl - minslpl; maxc = max(maxc, c); maxmaxb = max(maxmaxb, maxb); #ifdef DEBUG fprintf(stderr, " poprz = %lld, sumsum = %lld, maxslpl = %lld, minslpl = %lld, c = %lld, maxc = %lld, maxmaxb = %lld\n", poprz_best_maxslpl, sumsum, maxslpl, minslpl, c, maxc, maxmaxb); #endif } printf("%lld\n", max(0LL, sumsum + max(maxmaxb, maxc))); } return 0; } |