#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(); } |
English