// ./rpa_linux/rpa.sh test --source=main.cpp --extra_flags="-Wall,-Wextra" --nodes=3 < zaw/kan0a.in #include "kanapka.h" #include "message.h" #include <cstdio> #include <algorithm> //#define DBG(...) fprintf(stderr, __VA_ARGS__) #define DBG(...) typedef int I; typedef long long L; using std::min; using std::max; static void calc(L begin, L end) { L sum = 0; L best_local = 0; L best_left = 0; L worst_left = 0; L local = 0; for (L l=begin; l<end; ++l) { L t = GetTaste(l); sum += t; best_left = min(best_left, sum); worst_left = max(worst_left, sum); local = min(0ll, local + t); best_local = min(best_local, local); } L best_right = sum - worst_left; PutLL(0, sum); PutLL(0, best_local); PutLL(0, best_left); PutLL(0, best_right); Send(0); } int main() { I nID = MyNodeId(); I nNodes = NumberOfNodes(); L n = GetN(); // podział na nody L perNode = n / nNodes; L begin = nID * perNode; L end = (nID + 1 == nNodes) ? n : begin + perNode; DBG("split [%lld, %lld>\n", begin, end); // obliczenia calc(begin, end); // agregacja if (nID != 0) return 0; L sum = 0; L best = 0; L last_right = 0; for (I n=0; n<nNodes; ++n) { Receive(n); L node_sum = GetLL(n); L node_best = GetLL(n); L node_left = GetLL(n); L node_right = GetLL(n); sum += node_sum; best = min(best, min(node_best, last_right + node_left)); last_right = min(node_right, last_right + node_sum); DBG("nsum %lld; nbest %lld; nleft %lld; nright %lld; best %lld; lastr %lld\n", node_sum, node_best, node_left, node_right, best, last_right); } DBG("sum %lld; best %lld; ret %lld\n", sum, best, sum - best); printf("%lld\n", sum - best); 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 | // ./rpa_linux/rpa.sh test --source=main.cpp --extra_flags="-Wall,-Wextra" --nodes=3 < zaw/kan0a.in #include "kanapka.h" #include "message.h" #include <cstdio> #include <algorithm> //#define DBG(...) fprintf(stderr, __VA_ARGS__) #define DBG(...) typedef int I; typedef long long L; using std::min; using std::max; static void calc(L begin, L end) { L sum = 0; L best_local = 0; L best_left = 0; L worst_left = 0; L local = 0; for (L l=begin; l<end; ++l) { L t = GetTaste(l); sum += t; best_left = min(best_left, sum); worst_left = max(worst_left, sum); local = min(0ll, local + t); best_local = min(best_local, local); } L best_right = sum - worst_left; PutLL(0, sum); PutLL(0, best_local); PutLL(0, best_left); PutLL(0, best_right); Send(0); } int main() { I nID = MyNodeId(); I nNodes = NumberOfNodes(); L n = GetN(); // podział na nody L perNode = n / nNodes; L begin = nID * perNode; L end = (nID + 1 == nNodes) ? n : begin + perNode; DBG("split [%lld, %lld>\n", begin, end); // obliczenia calc(begin, end); // agregacja if (nID != 0) return 0; L sum = 0; L best = 0; L last_right = 0; for (I n=0; n<nNodes; ++n) { Receive(n); L node_sum = GetLL(n); L node_best = GetLL(n); L node_left = GetLL(n); L node_right = GetLL(n); sum += node_sum; best = min(best, min(node_best, last_right + node_left)); last_right = min(node_right, last_right + node_sum); DBG("nsum %lld; nbest %lld; nleft %lld; nright %lld; best %lld; lastr %lld\n", node_sum, node_best, node_left, node_right, best, last_right); } DBG("sum %lld; best %lld; ret %lld\n", sum, best, sum - best); printf("%lld\n", sum - best); return 0; } |