#include <iostream> #include <vector> #include <cstdio> #include <cstdlib> #include "kanapka.h" #include "message.h" #define FOR(i,b,e) for(int i=(b); i <= (e); ++i) #define PB push_back using namespace std; typedef long long int LLI; typedef vector < LLI > VL; /*************************************************************************/ int main() { ios_base::sync_with_stdio(0); int n = GetN(); int id = MyNodeId(); int nodes = NumberOfNodes(); int len = (n + nodes - 1) / nodes; int L = id * len, R = L + len; LLI sum = 0, pref = 0, suff = 0, best = 0, curr = 0; for (int i = L; i < min(R,n); i++) { int v = GetTaste(i); curr = min(curr + v, 0LL); best = min(best, curr); sum += v; pref = min(pref, sum); suff = max(suff, sum); } suff = sum - suff; if (id) { PutLL(0, sum); PutLL(0, pref); PutLL(0, suff); PutLL(0, best); Send(0); } else { VL Sum(1,sum), Pref(1,pref), Suff(1,suff); LLI ans = best; FOR(i,1,nodes-1) { Receive(i); sum = GetLL(i); pref = GetLL(i); suff = GetLL(i); best = GetLL(i); Sum.PB(sum); Pref.PB(pref); Suff.PB(suff); ans = min(ans, best); } FOR(i,1,nodes-1) Sum[i] += Sum[i-1]; FOR(i,0,nodes-1) FOR(j,i+1,nodes-1) { LLI here = Suff[i] + Pref[j] + (j ? Sum[j-1] : 0) - Sum[i]; ans = min(ans, here); } cout << Sum.back() - ans; } 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 | #include <iostream> #include <vector> #include <cstdio> #include <cstdlib> #include "kanapka.h" #include "message.h" #define FOR(i,b,e) for(int i=(b); i <= (e); ++i) #define PB push_back using namespace std; typedef long long int LLI; typedef vector < LLI > VL; /*************************************************************************/ int main() { ios_base::sync_with_stdio(0); int n = GetN(); int id = MyNodeId(); int nodes = NumberOfNodes(); int len = (n + nodes - 1) / nodes; int L = id * len, R = L + len; LLI sum = 0, pref = 0, suff = 0, best = 0, curr = 0; for (int i = L; i < min(R,n); i++) { int v = GetTaste(i); curr = min(curr + v, 0LL); best = min(best, curr); sum += v; pref = min(pref, sum); suff = max(suff, sum); } suff = sum - suff; if (id) { PutLL(0, sum); PutLL(0, pref); PutLL(0, suff); PutLL(0, best); Send(0); } else { VL Sum(1,sum), Pref(1,pref), Suff(1,suff); LLI ans = best; FOR(i,1,nodes-1) { Receive(i); sum = GetLL(i); pref = GetLL(i); suff = GetLL(i); best = GetLL(i); Sum.PB(sum); Pref.PB(pref); Suff.PB(suff); ans = min(ans, best); } FOR(i,1,nodes-1) Sum[i] += Sum[i-1]; FOR(i,0,nodes-1) FOR(j,i+1,nodes-1) { LLI here = Suff[i] + Pref[j] + (j ? Sum[j-1] : 0) - Sum[i]; ans = min(ans, here); } cout << Sum.back() - ans; } return 0; } /*************************************************************************/ |