Cod sursa(job #466788)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 27 iunie 2010 14:49:21
Problema Numarare Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 0.86 kb
#include<algorithm>
using namespace std;
#define N_MAX 100005
int a[N_MAX],n,i,j,k,s;
long long sum[N_MAX];
long long rez;

float modul(float x)
{
	if(x<0)
		return -x;
	return x;
}

int main()
{
	freopen("numarare.in","r",stdin);
	freopen("numarare.out","w",stdout);

	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		sum[i]=a[i]+sum[i-1];
	}

	int lg=1,step;
	for(;lg<n;lg<<=1);
	for(k=1;k<n;k++)
	{
		i=k;	j=k+1;	s=a[i]+a[j];	//rez++;
		for(step=lg;step;step>>=1)
		{
			if(j+step>n||i-step<1)
				continue;
			if(modul((float)(sum[j+step]-sum[i-step-1])/(j-i+1+2*step)-(float)(a[j]+a[i])/2)<=0.0000001)
				j+=step,i-=step;
		}
		rez=rez+k-i+1;
		/*while(i>1&&j<n&&s==a[i]+a[j])
			i--,j++,rez++;*/
	}

	/*printf("100000\n");
	for(i=1;i<=100000;i++)
		printf("%d ",i);
		*/
	printf("%lld\n",rez);
	return 0;
}