Cod sursa(job #28879)

Utilizator megabyteBarsan Paul megabyte Data 8 martie 2007 13:45:48
Problema Buline Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#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;
}