#include <cstdio> #include <cstdlib> #include "message.h" #include "kanapka.h" long long int max(long long int a,long long int b) { return (a>b)?a:b; } int main() { long long int pocz,kon,ID,Nod; long long int N; N=GetN(); Nod=NumberOfNodes(); ID=MyNodeId(); pocz=N*ID/Nod; kon=N*(ID+1)/Nod; long long int ileel=kon-pocz; long long int * najzp; long long int * sumy; najzp=(long long int *) malloc(sizeof(long long int)*(ileel+2)); sumy=(long long int *) malloc(sizeof(long long int)*(ileel+2)); sumy[0]=0; najzp[ileel+1]=0; long long int suma=0,a,zlew=0,zpraw=0,zobu=0,razem,tmp; for (long long int i=pocz;i<kon;i++) { a=GetTaste(i); suma+=a; sumy[i-pocz+1]=suma; if (suma>zlew) zlew=suma; } razem=suma; for (long long int i=ileel;i>0;i--) { tmp=razem-sumy[i-1]; if (tmp>zpraw) zpraw=tmp; najzp[i]=zpraw; } for (long long int i=0;i<=ileel;i++) { tmp=sumy[i]+najzp[i+1]; if (tmp>zobu) zobu=tmp; } free(najzp); free(sumy); long long int zlew2=0,zpraw2=0,zobu2=0,razem2; //------------------------------------------------------------- int kto; for (int podz=1;podz<Nod;podz*=2) { if (ID%(2*podz)!=0) { kto=(ID-podz); PutLL(kto,zlew); PutLL(kto,zpraw); PutLL(kto,zobu); PutLL(kto,razem); Send(kto); return 0; } else { kto=(ID+podz); if (kto>=Nod) continue; Receive(kto); zlew2=GetLL(kto); zpraw2=GetLL(kto); zobu2=GetLL(kto); razem2=GetLL(kto); zobu=max(max(zlew+zpraw2,razem+zobu2),razem2+zobu); zlew=max(zlew,razem+zlew2); zpraw=max(zpraw2,razem2+zpraw); razem=razem+razem2; } } if (ID==0) printf("%lld\n",zobu); 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 | #include <cstdio> #include <cstdlib> #include "message.h" #include "kanapka.h" long long int max(long long int a,long long int b) { return (a>b)?a:b; } int main() { long long int pocz,kon,ID,Nod; long long int N; N=GetN(); Nod=NumberOfNodes(); ID=MyNodeId(); pocz=N*ID/Nod; kon=N*(ID+1)/Nod; long long int ileel=kon-pocz; long long int * najzp; long long int * sumy; najzp=(long long int *) malloc(sizeof(long long int)*(ileel+2)); sumy=(long long int *) malloc(sizeof(long long int)*(ileel+2)); sumy[0]=0; najzp[ileel+1]=0; long long int suma=0,a,zlew=0,zpraw=0,zobu=0,razem,tmp; for (long long int i=pocz;i<kon;i++) { a=GetTaste(i); suma+=a; sumy[i-pocz+1]=suma; if (suma>zlew) zlew=suma; } razem=suma; for (long long int i=ileel;i>0;i--) { tmp=razem-sumy[i-1]; if (tmp>zpraw) zpraw=tmp; najzp[i]=zpraw; } for (long long int i=0;i<=ileel;i++) { tmp=sumy[i]+najzp[i+1]; if (tmp>zobu) zobu=tmp; } free(najzp); free(sumy); long long int zlew2=0,zpraw2=0,zobu2=0,razem2; //------------------------------------------------------------- int kto; for (int podz=1;podz<Nod;podz*=2) { if (ID%(2*podz)!=0) { kto=(ID-podz); PutLL(kto,zlew); PutLL(kto,zpraw); PutLL(kto,zobu); PutLL(kto,razem); Send(kto); return 0; } else { kto=(ID+podz); if (kto>=Nod) continue; Receive(kto); zlew2=GetLL(kto); zpraw2=GetLL(kto); zobu2=GetLL(kto); razem2=GetLL(kto); zobu=max(max(zlew+zpraw2,razem+zobu2),razem2+zobu); zlew=max(zlew,razem+zlew2); zpraw=max(zpraw2,razem2+zpraw); razem=razem+razem2; } } if (ID==0) printf("%lld\n",zobu); return 0; } |