Pagini recente » Cod sursa (job #1573742) | Cod sursa (job #228631) | Cod sursa (job #1343953) | Cod sursa (job #1648056) | Cod sursa (job #28879)
Cod sursa(job #28879)
#include <stdio.h>
#define INF "buline.in"
#define OUF "buline.out"
#define NMAX 524288
int sum[NMAX],a[NMAX],deq[NMAX],pt[NMAX]={0};
int main()
{
FILE *in,*out;
int q,i,j,x,n,p,max;
int dsum,sums;
in=fopen(INF,"r");
out=fopen(OUF,"w");
fscanf(in,"%d",&n);
deq[0]=0;
for(i=1;i<=n;i++)
{
fscanf(in,"%d %d",a+i,&x);
if(!x) a[i]*=(-1);
deq[i]=deq[i-1]+a[i];
}
for(i=1,j=n+1;i<=n;i++,j++) {a[j]=a[i];deq[j]=deq[j-1]+a[j];}
sum[0]=0;pt[0]=0;dsum=0;
p=1;q=1;max=(1<<30)*(-1);
for(i=1;i<=n;i++)
{
if(dsum<=0)
{
q=p=i;
dsum=a[i];
pt[i]=i;
sum[i]=dsum;
}
else
{
dsum+=a[i];
pt[i]=p;
sum[i]=dsum;
}
if(deq[i]<deq[q]) q=i;
}
sums=0;
for(i=n+1;i<2*n;i++)
{
if(i-p+1>=n){dsum-=a[p]; sums+=a[p]; p++;}
sums=deq[p-1];
while(p<=q) { dsum-=a[p]; sums+=a[p]; p++; }
//while(p<=q&&deq[q-1]-sums<=0) p++;
if(dsum<=0)
{
p=i;
dsum=a[i];
pt[i]=i;
sum[i]=dsum;
}
else
{
dsum+=a[i];
pt[i]=p;
sum[i]=dsum;
}
if(deq[i]<deq[q]) q=i;
}
p=0;
for(i=1;i<2*n;i++)
if(sum[i]>max) {p=i;max=sum[i];}
//printf("\n");
//for(i=1;i<2*n;i++) printf("%d ",pt[i]);
fprintf(out,"%d %d %d",max,pt[p],(p-pt[p]+1));
fclose(in);fclose(out);
return 0;
}