Cod sursa(job #466806)

Utilizator tranbachhaiTran Bach Hai tranbachhai Data 27 iunie 2010 14:58:57
Problema Numarare Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 1.15 kb
#include<stdio.h>
#include<math.h>
#define NMAX 100010
#define eps 0.0000000001
#define l 0.99999999999

int n,v[NMAX];
long long sum;
double hash[NMAX],s[NMAX],sumh[NMAX];

int verif(int a,int b)
{
double x;
x=fabs(s[(b<<1)-a+1]-s[b]+(hash[b-a+1])*(s[b]-s[a-1])-(sumh[(b<<1)-a+1]-sumh[b])*(v[b]+v[b+1]));
	if (eps>x)
		return 1;
	return 0;
}	

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);
hash[0]=1;
for (i=1;i<=n;++i)
	{
	scanf("%ld",&v[i]);
	hash[i]=hash[i-1]*l;
	sumh[i]=hash[i]+sumh[i-1];
	s[i]=s[i-1]+v[i]*hash[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
	{
		for(i=1;i<n;++i)
				sol+=(long long)(i-caut(i)+1);
		printf("%lld",sol);		
	}
return 0;
}