#include "kanapka.h"
#include "message.h"
#include <algorithm>
#include <iostream>
#include <math.h>
using namespace std;
int main() {
long long N = GetN();
int mynode = MyNodeId();
int ileNode = NumberOfNodes();
if(N<1000000)ileNode=1;
long long tS[ileNode];
long long tS_L[ileNode];
long long tS_P[ileNode];
long long tS_Lm[ileNode];
long long tS_Pm[ileNode];
int g = N/ileNode+1;
long long S=0;
long long S_L=0;
long long S_P=0;
long long S_Lm=0;
long long S_Pm=0;
int h;
long long w;
w =0;
for(int i=g*mynode;i<min((long long)g*(mynode+1),N);i++){
h = GetTaste(i);
S+=h;
w+=h;
if(S_L<w)S_L=w;
}
w = 0;
for(int i=min((long long)g*(mynode+1),N)-1;i>=g*mynode;i--){
h = GetTaste(i);
w+=h;
if(S_P<w)S_P=w;
}
long long suma = 0;
long long S_L2=0;
long long S_P2=S;
w = 0;
for(int i=g*mynode;i<min((long long)g*(mynode+1),N);i++){
h = GetTaste(i);
S_L2+=h;
if(S_Lm<S_L2)S_Lm=S_L2;
S_P2-=h;
if(suma<S_P2+S_Lm){
suma=S_P2+S_Lm;
S_Pm=S_P2;
}
}
if (mynode > 0) {
PutLL(0, S);
PutLL(0,S_L);
PutLL(0,S_P);
PutLL(0,S_Lm);
PutLL(0,S_Pm);
Send(0);
} else {
tS[0] = S;
tS_L[0] = S_L;
tS_P[0] = S_P;
tS_Lm[0] = S_Lm;
tS_Pm[0] = S_Pm;
for (int instancja = 1; instancja < ileNode; ++instancja) {
Receive(instancja);
tS[instancja] = GetLL(instancja);
tS_L[instancja] = GetLL(instancja);
tS_P[instancja] = GetLL(instancja);
tS_Lm[instancja] = GetLL(instancja);
tS_Pm[instancja] = GetLL(instancja);
}
long long G_S = 0;
for(int i = 0; i<ileNode;i++){
G_S+=tS[i];
}
long long G_PS = 0;
long long G_LS = 0;
suma = max((long long)0,G_S);
long long sumaL = 0;
for(int i = 0; i<ileNode;i++){
sumaL+=tS[i];
if(suma<G_LS+tS_P[i]+G_S-sumaL)suma=G_LS+tS_P[i]+G_S-sumaL;
if(suma<tS_Lm[i]+tS_Pm[i]+G_S-tS[i])suma=tS_Lm[i]+tS_Pm[i]+G_S-tS[i];// ok
// if(suma<tS_L[i]+G_S-tS[i])suma=tS_L[i]+G_S-tS[i];// ok
// if(suma<G_S+tS_P[i]-tS[i])suma=G_S+tS_P[i]-tS[i];// ok
G_LS=max(G_LS,sumaL+tS_L[i]-tS[i]);
//sumaL+=tS[i];
}
cout<<suma<<"\n";
}
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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | #include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> #include <math.h> using namespace std; int main() { long long N = GetN(); int mynode = MyNodeId(); int ileNode = NumberOfNodes(); if(N<1000000)ileNode=1; long long tS[ileNode]; long long tS_L[ileNode]; long long tS_P[ileNode]; long long tS_Lm[ileNode]; long long tS_Pm[ileNode]; int g = N/ileNode+1; long long S=0; long long S_L=0; long long S_P=0; long long S_Lm=0; long long S_Pm=0; int h; long long w; w =0; for(int i=g*mynode;i<min((long long)g*(mynode+1),N);i++){ h = GetTaste(i); S+=h; w+=h; if(S_L<w)S_L=w; } w = 0; for(int i=min((long long)g*(mynode+1),N)-1;i>=g*mynode;i--){ h = GetTaste(i); w+=h; if(S_P<w)S_P=w; } long long suma = 0; long long S_L2=0; long long S_P2=S; w = 0; for(int i=g*mynode;i<min((long long)g*(mynode+1),N);i++){ h = GetTaste(i); S_L2+=h; if(S_Lm<S_L2)S_Lm=S_L2; S_P2-=h; if(suma<S_P2+S_Lm){ suma=S_P2+S_Lm; S_Pm=S_P2; } } if (mynode > 0) { PutLL(0, S); PutLL(0,S_L); PutLL(0,S_P); PutLL(0,S_Lm); PutLL(0,S_Pm); Send(0); } else { tS[0] = S; tS_L[0] = S_L; tS_P[0] = S_P; tS_Lm[0] = S_Lm; tS_Pm[0] = S_Pm; for (int instancja = 1; instancja < ileNode; ++instancja) { Receive(instancja); tS[instancja] = GetLL(instancja); tS_L[instancja] = GetLL(instancja); tS_P[instancja] = GetLL(instancja); tS_Lm[instancja] = GetLL(instancja); tS_Pm[instancja] = GetLL(instancja); } long long G_S = 0; for(int i = 0; i<ileNode;i++){ G_S+=tS[i]; } long long G_PS = 0; long long G_LS = 0; suma = max((long long)0,G_S); long long sumaL = 0; for(int i = 0; i<ileNode;i++){ sumaL+=tS[i]; if(suma<G_LS+tS_P[i]+G_S-sumaL)suma=G_LS+tS_P[i]+G_S-sumaL; if(suma<tS_Lm[i]+tS_Pm[i]+G_S-tS[i])suma=tS_Lm[i]+tS_Pm[i]+G_S-tS[i];// ok // if(suma<tS_L[i]+G_S-tS[i])suma=tS_L[i]+G_S-tS[i];// ok // if(suma<G_S+tS_P[i]-tS[i])suma=G_S+tS_P[i]-tS[i];// ok G_LS=max(G_LS,sumaL+tS_L[i]-tS[i]); //sumaL+=tS[i]; } cout<<suma<<"\n"; } return 0; } |
English