Cod sursa(job #211562)

Utilizator 0000go gcc 0000 Data 2 octombrie 2008 20:22:41
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<stdio.h>
#include<algorithm>
#define ran 1<<20
using namespace std;
int n,l,u,m;
unsigned int a[ran],b[ran];
int c[ran];
int d[ran],e[ran];
int numd,nume;
long long ans;

char s[(1<<20)*11+99];
int main()
{
	int i,x,y,w;
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
		
	fread(s,sizeof(char),(1<<20)*11+99,stdin);
	for(w=0; !(s[w]>='0' && s[w]<='9'); w++);
	for(n=0; s[w]>='0' && s[w]<='9'; n=n*10+s[w++]-'0');
	for(; !(s[w]>='0' && s[w]<='9'); w++);
	for(l=0; s[w]>='0' && s[w]<='9'; l=l*10+s[w++]-'0');
	for(; !(s[w]>='0' && s[w]<='9'); w++);
	for(u=0; s[w]>='0' && s[w]<='9'; u=u*10+s[w++]-'0');
//	scanf("%d%d%d",&n,&l,&u);
	for(i=0; i<n; i++)
	{
		for(; !(s[w]>='0' && s[w]<='9'); w++);
		for(a[i]=0; s[w]>='0' && s[w]<='9'; a[i]=a[i]*10+s[w++]-'0');
//		scanf("%u",&a[i]);
		b[i]=a[i];
	}
	sort(b,b+n);
	for(i=0; i<n; i++)
	if(i==0 || b[i]!=b[i-1])
	b[m++]=b[i];
	if(l>m){puts("0");return 0;}
	if(u>m)u=m;
	for(i=0; i<n; i++)
	{
		x=0,y=n-1;
		while(1)
		{
			c[i]=(x+y)/2;
			if(a[i]==b[c[i]])
			break;
			else
			if(a[i]<b[c[i]])
			y=c[i]-1;
			else
			x=c[i]+1;
		}
	}
	ans=0;
	numd=0;
	for(x=0;;x++)
	{
		if(d[c[x]]==0)numd++;
		d[c[x]]++;
		if(numd==l)break;
	}
	nume=0;
	for(y=0; y<n; y++)
	{
		if(e[c[y]]==0)nume++;
		e[c[y]]++;
		if(nume>u)break;
	}
	for(i=0; i<n; i++)
	{
		ans+=y-x;
		d[c[i]]--;if(d[c[i]]==0)numd--;
		e[c[i]]--;if(e[c[i]]==0)nume--;
		while(numd<l)
		{
			x++;
			if(x==n)break;
			if(d[c[x]]==0)numd++;
			d[c[x]]++;
		}
		if(x==n)break;
		if(y==n)continue;
		while(y<n && nume<=u)
		{
			y++;
			if(y==n)break;
			if(e[c[y]]==0)nume++;
			e[c[y]]++;
		}
	}
	printf("%lld\n",ans);
	return 0;
}