#include "kanapka.h"
#include "message.h"
#include <algorithm>
#include <iostream>
using namespace std;
int suma(long long sumarr[], int from, int too)
{
  long long ans = 0;
  for (int i=from; i<=too; i++){
    ans+=sumarr[i];
  }
  return ans;
}
int main() {
  long long N = GetN();
  int nodes = NumberOfNodes();
  long long sum = 0ll;
  long long MIN = -10000000000ll, MAX = 10000000000ll;
  long long prefix_max = 0ll;
  long long prefix_min = 0ll;
  long long suffix_min = 0ll;
  long long inner_min = 0;
  long long poczatek = (MyNodeId() * N) / nodes;
  long long koniec = ((MyNodeId() + 1) * N) / nodes;
  /*if (MyNodeId() == 0) {
    for (int i=0; i<N; i++){
      cout << GetTaste(i) << " ";
    }
    cout << endl;
  }*/
  // Faza pierwsza.
  long long inner = 0;
  for (long long i = poczatek; i < koniec; ++i) {
      long long taste = GetTaste(i);
      sum = sum + taste;
      prefix_max = max(prefix_max, sum);
      prefix_min = min(prefix_min, sum);
      inner = min(0ll, inner + taste);
      inner_min = min(inner_min, inner);
  }
  suffix_min = sum - prefix_max;
//cout <<"Node "<<MyNodeId()<<" from: "<<poczatek<<" to: "<<koniec<<" sum: "<<sum<<" prefix_min: "<<prefix_min<<" suffix_min: "<<suffix_min<<" inner_min: "<<inner_min<<endl;
  if (MyNodeId() > 0) {
        PutLL(0, sum);
        PutLL(0, prefix_min);
        PutLL(0, suffix_min);
        PutLL(0, inner_min);
        //cout << "Node "+MyNodeId()" wysyla dane : from: "+poczatek <<", to: "+koniec <<",sum : " + sum << ", pmin : " + prefix_min << ", smin: " + suffix_min <<endl;
        Send(0);
  } else {
    long long sumarr[nodes];
    long long prefixes[nodes];
    long long suffixes[nodes];
    long long inners[nodes];
    sumarr[0] = sum;
    prefixes[0] = prefix_min;
    suffixes[0] = suffix_min;
    inners[0] = inner_min;
    long long all = sumarr[0];
    for (int i=1; i<nodes; ++i){
      int instancja = Receive(-1);
      sumarr[instancja] = GetLL(instancja);
      prefixes[instancja] = GetLL(instancja);
      suffixes[instancja] = GetLL(instancja);
      inners[instancja] = GetLL(instancja);
      all += sumarr[instancja];
    }
    long long worse = MAX;
    for (int a = 0; a<nodes; a++){
      for (int b = a + 1; b<nodes; b++){
        worse = min(worse, suffixes[a] + suma(sumarr, a+1, b-1) + prefixes[b]);
      }
      worse = min(worse, inners[a]);
      worse = min(worse, prefixes[a]);
      worse = min(worse, suffixes[a]);
    }
    worse = min(worse, suffixes[nodes-1]);
    cout << (all - worse) << endl;
  }
  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 | #include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> using namespace std; int suma(long long sumarr[], int from, int too) { long long ans = 0; for (int i=from; i<=too; i++){ ans+=sumarr[i]; } return ans; } int main() { long long N = GetN(); int nodes = NumberOfNodes(); long long sum = 0ll; long long MIN = -10000000000ll, MAX = 10000000000ll; long long prefix_max = 0ll; long long prefix_min = 0ll; long long suffix_min = 0ll; long long inner_min = 0; long long poczatek = (MyNodeId() * N) / nodes; long long koniec = ((MyNodeId() + 1) * N) / nodes; /*if (MyNodeId() == 0) { for (int i=0; i<N; i++){ cout << GetTaste(i) << " "; } cout << endl; }*/ // Faza pierwsza. long long inner = 0; for (long long i = poczatek; i < koniec; ++i) { long long taste = GetTaste(i); sum = sum + taste; prefix_max = max(prefix_max, sum); prefix_min = min(prefix_min, sum); inner = min(0ll, inner + taste); inner_min = min(inner_min, inner); } suffix_min = sum - prefix_max; //cout <<"Node "<<MyNodeId()<<" from: "<<poczatek<<" to: "<<koniec<<" sum: "<<sum<<" prefix_min: "<<prefix_min<<" suffix_min: "<<suffix_min<<" inner_min: "<<inner_min<<endl; if (MyNodeId() > 0) { PutLL(0, sum); PutLL(0, prefix_min); PutLL(0, suffix_min); PutLL(0, inner_min); //cout << "Node "+MyNodeId()" wysyla dane : from: "+poczatek <<", to: "+koniec <<",sum : " + sum << ", pmin : " + prefix_min << ", smin: " + suffix_min <<endl; Send(0); } else { long long sumarr[nodes]; long long prefixes[nodes]; long long suffixes[nodes]; long long inners[nodes]; sumarr[0] = sum; prefixes[0] = prefix_min; suffixes[0] = suffix_min; inners[0] = inner_min; long long all = sumarr[0]; for (int i=1; i<nodes; ++i){ int instancja = Receive(-1); sumarr[instancja] = GetLL(instancja); prefixes[instancja] = GetLL(instancja); suffixes[instancja] = GetLL(instancja); inners[instancja] = GetLL(instancja); all += sumarr[instancja]; } long long worse = MAX; for (int a = 0; a<nodes; a++){ for (int b = a + 1; b<nodes; b++){ worse = min(worse, suffixes[a] + suma(sumarr, a+1, b-1) + prefixes[b]); } worse = min(worse, inners[a]); worse = min(worse, prefixes[a]); worse = min(worse, suffixes[a]); } worse = min(worse, suffixes[nodes-1]); cout << (all - worse) << endl; } return 0; } | 
 
            
         English
                    English