#include "maklib.h"
#include "message.h"
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<tr1/unordered_map>
#include<queue>
#include<cstdlib>
#include<list>
#include<set>
#include<map>
#include<cmath>
#define MP make_pair
#define PB push_back
#define s second
#define f first
#define PII pair<int,int>
#define VPII vector <pair<int,int> >
#define VI vector <int>
#define abs(a) max((a),-(a))
#define LL long long
#define LD long double
#define ALL(x) x.begin(),x.end()
#define PU putchar_unlocked
#define GU getchar_unlocked
#define DBG(x) cerr<<#x<<" "<<(x)<<endl;
using namespace std;
int a,b,c,d,e,f,n,m,mx,l,z,r,k;
int wynik;
char ch;
int INF=1e9+1;
LL tsum[101];
LL tpref[101];
LL tsuf[101];
int X;
LL mxpref=0;
LL mxsuf=0;
LL sum=0,minsum=0;
LL best=0;
void HEAD()
{
tsum[0]=sum;
tpref[0]=mxpref;
tsuf[0]=mxsuf;
for(int i=1;i<X;i++)
{
Receive(i);
best=max(best,GetLL(i));
tsum[i]=GetLL(i);
tpref[i]=GetLL(i);
tsuf[i]=GetLL(i);
}
for(int i=0;i<X;i++)
{
sum=0;
for(int j=i+1;j<X;j++)
{
best=max(best,tsuf[i]+tpref[j]+sum);
sum+=tsum[j];
}
}
printf("%lld\n",best);
}
main()
{
//cout<<MyNodeId()<<endl;
int n=Size();
X=NumberOfNodes();
int SEGSIZ=n/X+(n%X?1:0);
int poc=SEGSIZ*MyNodeId()+1;
int kon=min(poc+SEGSIZ-1,n);
for(int i=poc;i<=kon;i++)
{
sum+=ElementAt(i);
mxpref=max(mxpref,sum);
minsum=min(sum,minsum);
best=max(best,sum-minsum);
}
sum=0;
for(int i=kon;i>=poc;i--)
{
sum+=ElementAt(i);
mxsuf=max(mxsuf,sum);
}
if(MyNodeId()>0)
{
PutLL(0,best);
PutLL(0,sum);
PutLL(0,mxpref);
PutLL(0,mxsuf);
Send(0);
}
else
{
HEAD();
}
}
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 | #include "maklib.h" #include "message.h" #include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<tr1/unordered_map> #include<queue> #include<cstdlib> #include<list> #include<set> #include<map> #include<cmath> #define MP make_pair #define PB push_back #define s second #define f first #define PII pair<int,int> #define VPII vector <pair<int,int> > #define VI vector <int> #define abs(a) max((a),-(a)) #define LL long long #define LD long double #define ALL(x) x.begin(),x.end() #define PU putchar_unlocked #define GU getchar_unlocked #define DBG(x) cerr<<#x<<" "<<(x)<<endl; using namespace std; int a,b,c,d,e,f,n,m,mx,l,z,r,k; int wynik; char ch; int INF=1e9+1; LL tsum[101]; LL tpref[101]; LL tsuf[101]; int X; LL mxpref=0; LL mxsuf=0; LL sum=0,minsum=0; LL best=0; void HEAD() { tsum[0]=sum; tpref[0]=mxpref; tsuf[0]=mxsuf; for(int i=1;i<X;i++) { Receive(i); best=max(best,GetLL(i)); tsum[i]=GetLL(i); tpref[i]=GetLL(i); tsuf[i]=GetLL(i); } for(int i=0;i<X;i++) { sum=0; for(int j=i+1;j<X;j++) { best=max(best,tsuf[i]+tpref[j]+sum); sum+=tsum[j]; } } printf("%lld\n",best); } main() { //cout<<MyNodeId()<<endl; int n=Size(); X=NumberOfNodes(); int SEGSIZ=n/X+(n%X?1:0); int poc=SEGSIZ*MyNodeId()+1; int kon=min(poc+SEGSIZ-1,n); for(int i=poc;i<=kon;i++) { sum+=ElementAt(i); mxpref=max(mxpref,sum); minsum=min(sum,minsum); best=max(best,sum-minsum); } sum=0; for(int i=kon;i>=poc;i--) { sum+=ElementAt(i); mxsuf=max(mxsuf,sum); } if(MyNodeId()>0) { PutLL(0,best); PutLL(0,sum); PutLL(0,mxpref); PutLL(0,mxsuf); Send(0); } else { HEAD(); } } |
English