Cod sursa(job #466729)

Utilizator tranbachhaiTran Bach Hai tranbachhai Data 27 iunie 2010 13:48:59
Problema Numarare Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 1 kb
#include<stdio.h>
#define NMAX 100010

int n,v[NMAX];
long long sum,s[NMAX];

int verif(int a,int b)
{
	return (long long)s[(b<<1)-a+1]-s[a-1]==(b-a+1)*(v[b]+v[b+1]) &&
					  s[(b<<1)-a+1]-s[a-1]==(b-a+1)*(v[a]+v[(b<<1)-a+1]);
}	

int caut(int cent)
{
	int m,st,dr,i;
	dr=cent;
	if ((cent<<1)>n)
		st=(cent<<1)-n+1;
	else st=1;
	while(st+1<dr)
		{
			m=(st+dr)>>1;
			if (verif(m,cent))
				dr=m;
			else
				st=m;
		}
	for (i=st;i<=dr;++i)	
		if (verif(i,cent))
			return i;
	return cent-1;
}

int main()
{
int i,j;
long long sol=0;
freopen("numarare.in","r",stdin);
freopen("numarare.out","w",stdout);

scanf("%d",&n);
for (i=1;i<=n;++i)
	{
	scanf("%ld",&v[i]);
	s[i]=(long long)s[i-1]+v[i];
	}
if (n<=1000)
	{
		int sum=0;
		for (i=1;i<n;++i)
			for (j=1;j<=i;++j)
					if (v[i-j+1]+v[i+j]==v[i]+v[i+1])
						++sum;
				else break;
		printf("%lld",sum);
	}
else
	{
		v[0]=-200001;
		v[n+1]=-200001;
		for(i=1;i<n;++i)
				sol+=(i-caut(i)+1);
		printf("%lld",sol);		
	}
return 0;
}