#include "kanapka.h"
#include "message.h"
#include <algorithm>
#include <iostream>
using namespace std;
#define LL long long
#define INF 1000000000000LL
LL nodes_cnt = 0;
struct RangeData {
  LL left;
  LL right;
  LL sum;
  LL maxSumLeft;
  LL maxSumRight;
  LL minSumLeft;
  LL minSumRight;
  LL minMiddleSum;
  RangeData(LL left, LL right) 
      : left(left)
      , right(right)
      , sum(0)
      , maxSumLeft(-INF)
      , maxSumRight(-INF)
      , minSumLeft(0)
      , minSumRight(0)
      , minMiddleSum(0)
    {}
};
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
/*
 *
 *
 */
RangeData compute_sum(LL left, LL right) {
    RangeData rd(left, right);
    rd.sum = GetTaste(left);
    LL current = 0ll;
    for (LL i=left+1; i < right; i++) {
       LL ti = GetTaste(i);
       rd.sum += ti;
       rd.maxSumLeft = max(rd.sum, rd.maxSumLeft);
       rd.minSumLeft = min(rd.sum, rd.minSumLeft);
       current += ti;
       if (current > 0ll) {
            current = 0ll;
       }
       if (current < rd.minMiddleSum) {
            rd.minMiddleSum = current;
       }
       // printf("i=%lld sum=%lld mxLeft=%lld minLeft=%lld mid:%lld\n", i, rd.sum, rd.maxSumLeft, rd.minSumLeft, rd.minMiddleSum);
    }
    rd.minSumRight = rd.sum - rd.maxSumLeft;
    rd.maxSumRight = rd.sum - rd.minSumLeft;
    return rd;
}
int masterNode = 0;
int main() {
  long long N = GetN();
  if (N == 1)
    cout << max(0ll, GetTaste(0)) << endl;
  else {
    int number_of_nodes = NumberOfNodes();
    if (MyNodeId() == masterNode) {
        RangeData rd = compute_sum(0, N);
        LL solution = max(0ll, rd.sum - rd.minMiddleSum);
        cout << solution << endl;
        for (int i=0; i < number_of_nodes; i++) {
            if (i==masterNode) {
                continue;
            }   
            PutLL(i, solution);
            Send(i);
        }   
    } else {
        int id = Receive(masterNode); 
        LL solution = GetLL(masterNode);
        // cout << solution << 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 | #include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> using namespace std; #define LL long long #define INF 1000000000000LL LL nodes_cnt = 0; struct RangeData { LL left; LL right; LL sum; LL maxSumLeft; LL maxSumRight; LL minSumLeft; LL minSumRight; LL minMiddleSum; RangeData(LL left, LL right) : left(left) , right(right) , sum(0) , maxSumLeft(-INF) , maxSumRight(-INF) , minSumLeft(0) , minSumRight(0) , minMiddleSum(0) {} }; #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) /* * * */ RangeData compute_sum(LL left, LL right) { RangeData rd(left, right); rd.sum = GetTaste(left); LL current = 0ll; for (LL i=left+1; i < right; i++) { LL ti = GetTaste(i); rd.sum += ti; rd.maxSumLeft = max(rd.sum, rd.maxSumLeft); rd.minSumLeft = min(rd.sum, rd.minSumLeft); current += ti; if (current > 0ll) { current = 0ll; } if (current < rd.minMiddleSum) { rd.minMiddleSum = current; } // printf("i=%lld sum=%lld mxLeft=%lld minLeft=%lld mid:%lld\n", i, rd.sum, rd.maxSumLeft, rd.minSumLeft, rd.minMiddleSum); } rd.minSumRight = rd.sum - rd.maxSumLeft; rd.maxSumRight = rd.sum - rd.minSumLeft; return rd; } int masterNode = 0; int main() { long long N = GetN(); if (N == 1) cout << max(0ll, GetTaste(0)) << endl; else { int number_of_nodes = NumberOfNodes(); if (MyNodeId() == masterNode) { RangeData rd = compute_sum(0, N); LL solution = max(0ll, rd.sum - rd.minMiddleSum); cout << solution << endl; for (int i=0; i < number_of_nodes; i++) { if (i==masterNode) { continue; } PutLL(i, solution); Send(i); } } else { int id = Receive(masterNode); LL solution = GetLL(masterNode); // cout << solution << endl; } } return 0; } | 
 
            
         English
                    English