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
#include <iostream>
#include <cstdio>
#include "message.h"
#include "kanapka.h"

using namespace std;

long long sumy[105];
long long wyniki[105];
long long max_lewe[105];
long long max_prawe[105];

int main ()
{
	long long moj_numer = MyNodeId();
	long long liczba_instancji = NumberOfNodes();
	long long N = GetN();
	long long poczatek, koniec;
	if (N <= 1000)
	{
		liczba_instancji = 1;
		poczatek = 0;
		koniec = N;
	}
	if (moj_numer >= liczba_instancji) return 0;
	if (N > 1000)
	{
		poczatek = moj_numer * (N / liczba_instancji);
		koniec = (moj_numer + 1) * (N / liczba_instancji);
		if (moj_numer == liczba_instancji - 1) koniec = N;
	}
	long long suma = 0;
	long long przedzial = 0;
	long long tymczasowy = 0;
	long long max_lewy = 0;
	for (long long i = poczatek; i < koniec; ++i)
	{
		long long A = GetTaste(i);
		suma += A;
		tymczasowy += A;
		if (tymczasowy > 0) tymczasowy = 0;
		if (tymczasowy < przedzial) przedzial = tymczasowy;
		if (suma > max_lewy) max_lewy = suma;
	}
	long long wynik = suma - przedzial;
	suma = 0;
	long long max_prawy = 0;
	for (long long i = koniec - 1; i >= poczatek; --i)
	{
		long long A = GetTaste(i);
		suma += A;
		if (suma > max_prawy) max_prawy = suma;
	}
	PutInt(0, suma);
	PutInt(0, wynik);
	PutInt(0, max_lewy);
	PutInt(0, max_prawy);
	Send(0);
	if (moj_numer > 0) return 0;
	for (int i = 0; i < liczba_instancji; ++i)
	{
		Receive(i);
		sumy[i] = GetInt(i);
		wyniki[i] = GetInt(i);
		max_lewe[i] = GetInt(i);
		max_prawe[i] = GetInt(i);
	}
	long long result = 0;
	for (int i = 0; i < liczba_instancji; ++i) for (int j = i; j < liczba_instancji; ++j)
	{
		long long tym;
		if (i == j)
		{
			tym = wyniki[i];
			for (int k = 0; k < liczba_instancji; ++k) if (k != i) tym += sumy[k];
			if (tym > result) result = tym;
		}
		else
		{
			tym = 0;
			for (int k = 0; k < i; ++k) tym += sumy[k];
			tym += max_lewe[i];
			tym += max_prawe[j];
			for (int k = j + 1; k < liczba_instancji; ++k) tym += sumy[k];
			if (tym > result) result = tym;
		}
	}
	printf("%lld\n", result);
	return 0;
}