#include <bits/stdc++.h> #include "message.h" #include "kanapka.h" using namespace std; typedef long long LL; const LL INF = 1e18; void startowy() { LL maxiL[100], maxiP[100], maxiIN[100], caly[100]; int n = GetN(); int ile = NumberOfNodes()-1; int start = 0; for(int i= 0;i<ile; ++i) { int dl = (n+i)/ile; PutInt(i+1,start); start += dl; PutInt(i+1,start); Send(i+1); } for(int i = 0;i<ile; ++i) { int nr = Receive(i+1); maxiL[i] = GetLL(i+1); maxiP[i] = GetLL(i+1); maxiIN[i] =GetLL(i+1); caly[i] = GetLL(i+1); //printf("%lld %lld %lld %lld\n",maxiL[i], maxiP[i], maxiIN[i], caly[i]); } LL sufSum[100] = {}; for(int i = ile-1; i >=0;--i) sufSum[i] = sufSum[i+1] + caly[i]; LL maxSuf[100] = {}; maxSuf[ile-1] =max(0ll, maxiP[ile-1]); for(int i = ile-2;i >= 0; --i) maxSuf[i] = max(maxSuf[i+1], sufSum[i+1] + maxiP[i]); LL res = -INF; LL prefSum = 0; LL maxPref= 0; for(int i = 0; i < ile; ++i) { res = max({res,maxPref + maxSuf[i], prefSum + maxiIN[i] + sufSum[i+1], prefSum + maxiL[i] + maxSuf[i+1], maxPref + maxiP[i] + sufSum[i+1]}); maxPref = max(maxPref, prefSum + maxiL[i]); prefSum += caly[i]; } printf("%lld\n", res); } void liczacy() { Receive(0); int l =GetInt(0), p = GetInt(0); //printf("jestem %d dostalem %d %d\n", MyNodeId(),l,p); LL maxiL = -INF, maxiIN = -INF, maxiP= -INF,suma= 0; vector<LL> maxi; for(int i= l; i < p; ++i) { suma += GetTaste(i); maxiL = max(maxiL,suma); maxi.push_back(maxiL); } suma = 0; int index =maxi.size()-1; for(int i= p-1; i >= l; --i, --index) { maxiIN = max(maxiIN, maxi[index] + maxiP); suma += GetTaste(i); maxiP = max(maxiP, suma); } maxiIN = max(maxiIN, suma); PutLL(0,maxiL); PutLL(0,maxiP); PutLL(0,maxiIN); PutLL(0,suma); Send(0); } int main() { if(MyNodeId() == 0) startowy(); else liczacy(); }
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 | #include <bits/stdc++.h> #include "message.h" #include "kanapka.h" using namespace std; typedef long long LL; const LL INF = 1e18; void startowy() { LL maxiL[100], maxiP[100], maxiIN[100], caly[100]; int n = GetN(); int ile = NumberOfNodes()-1; int start = 0; for(int i= 0;i<ile; ++i) { int dl = (n+i)/ile; PutInt(i+1,start); start += dl; PutInt(i+1,start); Send(i+1); } for(int i = 0;i<ile; ++i) { int nr = Receive(i+1); maxiL[i] = GetLL(i+1); maxiP[i] = GetLL(i+1); maxiIN[i] =GetLL(i+1); caly[i] = GetLL(i+1); //printf("%lld %lld %lld %lld\n",maxiL[i], maxiP[i], maxiIN[i], caly[i]); } LL sufSum[100] = {}; for(int i = ile-1; i >=0;--i) sufSum[i] = sufSum[i+1] + caly[i]; LL maxSuf[100] = {}; maxSuf[ile-1] =max(0ll, maxiP[ile-1]); for(int i = ile-2;i >= 0; --i) maxSuf[i] = max(maxSuf[i+1], sufSum[i+1] + maxiP[i]); LL res = -INF; LL prefSum = 0; LL maxPref= 0; for(int i = 0; i < ile; ++i) { res = max({res,maxPref + maxSuf[i], prefSum + maxiIN[i] + sufSum[i+1], prefSum + maxiL[i] + maxSuf[i+1], maxPref + maxiP[i] + sufSum[i+1]}); maxPref = max(maxPref, prefSum + maxiL[i]); prefSum += caly[i]; } printf("%lld\n", res); } void liczacy() { Receive(0); int l =GetInt(0), p = GetInt(0); //printf("jestem %d dostalem %d %d\n", MyNodeId(),l,p); LL maxiL = -INF, maxiIN = -INF, maxiP= -INF,suma= 0; vector<LL> maxi; for(int i= l; i < p; ++i) { suma += GetTaste(i); maxiL = max(maxiL,suma); maxi.push_back(maxiL); } suma = 0; int index =maxi.size()-1; for(int i= p-1; i >= l; --i, --index) { maxiIN = max(maxiIN, maxi[index] + maxiP); suma += GetTaste(i); maxiP = max(maxiP, suma); } maxiIN = max(maxiIN, suma); PutLL(0,maxiL); PutLL(0,maxiP); PutLL(0,maxiIN); PutLL(0,suma); Send(0); } int main() { if(MyNodeId() == 0) startowy(); else liczacy(); } |