#include <iostream> #include "message.h" #include "kanapka.h" using namespace std; typedef long long LL; struct { int total, id; } Node; int n; int from, to; int main() { Node.total = NumberOfNodes(); Node.id = MyNodeId(); n = GetN(); from = Node.id * ((n + Node.total - 1) / Node.total); to = min((Node.id + 1) * ((n + Node.total - 1) / Node.total), n) - 1; LL sum = 0; LL localSol = 0; LL ma = 0; LL mi = 0; for (int i = from; i <= to; i++) { int el = GetTaste(i); sum += el; localSol = min(localSol, sum - ma); ma = max(ma, sum); mi = min(mi, sum); } LL prevSum = 0; LL prevRes = 0; LL prevMax = 0; if (Node.id > 0) { Receive(Node.id - 1); prevSum = GetLL(Node.id - 1); prevRes = GetLL(Node.id - 1); prevMax = GetLL(Node.id - 1); } LL newRes = min(localSol, mi + prevSum - prevMax); newRes = min(newRes, prevRes); LL newSum = sum + prevSum; LL newMax = max(prevMax, prevSum + ma); if (Node.id + 1 < Node.total) { PutLL(Node.id + 1, newSum); PutLL(Node.id + 1, newRes); PutLL(Node.id + 1, newMax); Send(Node.id + 1); Receive(Node.id + 1); newSum = GetLL(Node.id + 1); newRes = GetLL(Node.id + 1); newMax = GetLL(Node.id + 1); } if (Node.id > 0) { PutLL(Node.id - 1, newSum); PutLL(Node.id - 1, newRes); PutLL(Node.id - 1, newMax); Send(Node.id - 1); } if (Node.id == 0) { cout << (newSum - newRes) << endl; } 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 | #include <iostream> #include "message.h" #include "kanapka.h" using namespace std; typedef long long LL; struct { int total, id; } Node; int n; int from, to; int main() { Node.total = NumberOfNodes(); Node.id = MyNodeId(); n = GetN(); from = Node.id * ((n + Node.total - 1) / Node.total); to = min((Node.id + 1) * ((n + Node.total - 1) / Node.total), n) - 1; LL sum = 0; LL localSol = 0; LL ma = 0; LL mi = 0; for (int i = from; i <= to; i++) { int el = GetTaste(i); sum += el; localSol = min(localSol, sum - ma); ma = max(ma, sum); mi = min(mi, sum); } LL prevSum = 0; LL prevRes = 0; LL prevMax = 0; if (Node.id > 0) { Receive(Node.id - 1); prevSum = GetLL(Node.id - 1); prevRes = GetLL(Node.id - 1); prevMax = GetLL(Node.id - 1); } LL newRes = min(localSol, mi + prevSum - prevMax); newRes = min(newRes, prevRes); LL newSum = sum + prevSum; LL newMax = max(prevMax, prevSum + ma); if (Node.id + 1 < Node.total) { PutLL(Node.id + 1, newSum); PutLL(Node.id + 1, newRes); PutLL(Node.id + 1, newMax); Send(Node.id + 1); Receive(Node.id + 1); newSum = GetLL(Node.id + 1); newRes = GetLL(Node.id + 1); newMax = GetLL(Node.id + 1); } if (Node.id > 0) { PutLL(Node.id - 1, newSum); PutLL(Node.id - 1, newRes); PutLL(Node.id - 1, newMax); Send(Node.id - 1); } if (Node.id == 0) { cout << (newSum - newRes) << endl; } return 0; } |