/*************************************************************************
* Zadanie: Maksymalna podtablica *
* Zlozonosc czasowa: O(n/inst) *
* Wynik: --/10 *
*************************************************************************/
#include <iostream>
#include <vector>
#include "message.h"
#include "maklib.h"
#define FOR(i,b,e) for(int i=(b); i <= (e); ++i)
#define SIZE(c) (int) (c).size()
#define FOREACH(i,c) FOR(i,0,SIZE(c)-1)
#define MIN(x,y) ( ((x) < (y))? (x) : (y) )
#define MAX(x,y) ( ((x) > (y))? (x) : (y) )
typedef long long int LLI;
using namespace std;
/*************************************************************************/
int main()
{
ios_base::sync_with_stdio(0);
int v = MyNodeId(), n = NumberOfNodes(), s = Size();
if (s <= 2000000)
{
if (v > 0) return 0;
vector < LLI > S(s,0);
LLI ans = 0;
FOR(i,0,s-1)
{
int d = ElementAt(i+1);
if (i == 0) S[0] = d;
else
{
if (S[i-1] < 0) S[i] = d;
else S[i] = S[i-1] + d;
}
ans = MAX(ans,S[i]);
}
cout << ans;
return 0;
}
else
{
int left = 1 + ( (v*s) / n ), right = 1 + ( ((v+1)*s) / n ); //moj fragment
LLI sum = 0;
FOR(i,0,right-left-1) sum += ElementAt(left+i);
if (v > 0)
{
PutLL(0,sum);
Send(0);
}
else
{
FOR(i,1,n-1)
{
Receive(i);
LLI x = GetLL(i);
sum += x;
}
if (ElementAt(s) > 0) cout << sum;
else cout << 0;
}
}
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 | /************************************************************************* * Zadanie: Maksymalna podtablica * * Zlozonosc czasowa: O(n/inst) * * Wynik: --/10 * *************************************************************************/ #include <iostream> #include <vector> #include "message.h" #include "maklib.h" #define FOR(i,b,e) for(int i=(b); i <= (e); ++i) #define SIZE(c) (int) (c).size() #define FOREACH(i,c) FOR(i,0,SIZE(c)-1) #define MIN(x,y) ( ((x) < (y))? (x) : (y) ) #define MAX(x,y) ( ((x) > (y))? (x) : (y) ) typedef long long int LLI; using namespace std; /*************************************************************************/ int main() { ios_base::sync_with_stdio(0); int v = MyNodeId(), n = NumberOfNodes(), s = Size(); if (s <= 2000000) { if (v > 0) return 0; vector < LLI > S(s,0); LLI ans = 0; FOR(i,0,s-1) { int d = ElementAt(i+1); if (i == 0) S[0] = d; else { if (S[i-1] < 0) S[i] = d; else S[i] = S[i-1] + d; } ans = MAX(ans,S[i]); } cout << ans; return 0; } else { int left = 1 + ( (v*s) / n ), right = 1 + ( ((v+1)*s) / n ); //moj fragment LLI sum = 0; FOR(i,0,right-left-1) sum += ElementAt(left+i); if (v > 0) { PutLL(0,sum); Send(0); } else { FOR(i,1,n-1) { Receive(i); LLI x = GetLL(i); sum += x; } if (ElementAt(s) > 0) cout << sum; else cout << 0; } } return 0; } /*************************************************************************/ |
English