//Potyczki 2014 MAK runda rozproszona probna
#include <algorithm>
#include <iostream>
#include <cmath>
#include "maklib.h"
#include "message.h"
using namespace std;
typedef long long ll;
struct Wynik
{
ll suma;
int s, k; //znacznik start i koniec max podsumy
};
Wynik MaxSum(int b, int e)
{
Wynik w = { 0, 0,0 };
ll m = 0, s = 0;
int si = 0, ki = 0;
for (int a = b; b < e; a++)
{
s = max(ll(0), s + ElementAt(a));
if (s == 0) //gdy suma sie nie zwieksza
si = a + 1; //zaczynamy podciag od nastepnego elementu
if (m < s) //nowa suma nowy koniec podciagu
ki = a;
m = max(m, s);
}
w.suma = m;
if (si <= ki) //suma != 0
{
if (si == 0) //poczatek
w.s = 1;
if (ki == e-1) //koniec
w.k = 1;
}
return w;
}
int main(int, char**)
{
ios_base::sync_with_stdio(0);
int s = Size(),
id = MyNodeId(),
idnum = NumberOfNodes(),
part = int(ceil(s / idnum));
int start = id*part,
end = min(start + part, s);
Wynik w = {};
if (start < s)
w = MaxSum(start, end);
else
w = { -1, 0, 0 };
if (id != 0)
{
PutInt(0, w.s);
PutLL(0, w.suma);
PutInt(0, w.k);
Send(0);
}
else
{
//a == 0
Wynik prev = w;
ll maxel = w.suma, //najwiekszy pojedynczy element
maxs = w.suma, //obecnie najwieksza suma
pmaxs = w.suma; //poprzednia najwiesza suma
for (int a = 1; a < idnum; a++)
{
int n = Receive(a);
Wynik tmp;
tmp.s = GetInt(a);
tmp.suma = GetLL(a);
tmp.k = GetInt(a);
if (tmp.suma < 0)
break;
//najwiekszy z pojedynczych
maxel = (tmp.suma > maxel) ? tmp.suma : maxel;
//koniec poprzedniego i poczatego obecnego
if (prev.k == 1 && tmp.s == 1) //mozemy laczyc
maxs += tmp.suma;
else //nie mozna laczyc
{
pmaxs = maxs;
maxs = tmp.suma;
}
prev = tmp;
}
ll m = max(max(maxs, pmaxs), maxel);
cout << m << 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 97 98 99 100 101 102 103 104 105 106 107 | //Potyczki 2014 MAK runda rozproszona probna #include <algorithm> #include <iostream> #include <cmath> #include "maklib.h" #include "message.h" using namespace std; typedef long long ll; struct Wynik { ll suma; int s, k; //znacznik start i koniec max podsumy }; Wynik MaxSum(int b, int e) { Wynik w = { 0, 0,0 }; ll m = 0, s = 0; int si = 0, ki = 0; for (int a = b; b < e; a++) { s = max(ll(0), s + ElementAt(a)); if (s == 0) //gdy suma sie nie zwieksza si = a + 1; //zaczynamy podciag od nastepnego elementu if (m < s) //nowa suma nowy koniec podciagu ki = a; m = max(m, s); } w.suma = m; if (si <= ki) //suma != 0 { if (si == 0) //poczatek w.s = 1; if (ki == e-1) //koniec w.k = 1; } return w; } int main(int, char**) { ios_base::sync_with_stdio(0); int s = Size(), id = MyNodeId(), idnum = NumberOfNodes(), part = int(ceil(s / idnum)); int start = id*part, end = min(start + part, s); Wynik w = {}; if (start < s) w = MaxSum(start, end); else w = { -1, 0, 0 }; if (id != 0) { PutInt(0, w.s); PutLL(0, w.suma); PutInt(0, w.k); Send(0); } else { //a == 0 Wynik prev = w; ll maxel = w.suma, //najwiekszy pojedynczy element maxs = w.suma, //obecnie najwieksza suma pmaxs = w.suma; //poprzednia najwiesza suma for (int a = 1; a < idnum; a++) { int n = Receive(a); Wynik tmp; tmp.s = GetInt(a); tmp.suma = GetLL(a); tmp.k = GetInt(a); if (tmp.suma < 0) break; //najwiekszy z pojedynczych maxel = (tmp.suma > maxel) ? tmp.suma : maxel; //koniec poprzedniego i poczatego obecnego if (prev.k == 1 && tmp.s == 1) //mozemy laczyc maxs += tmp.suma; else //nie mozna laczyc { pmaxs = maxs; maxs = tmp.suma; } prev = tmp; } ll m = max(max(maxs, pmaxs), maxel); cout << m << endl; } return 0; } |
English