#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; } |