Cod sursa(job #537072)

Utilizator bora_marianBora marian bora_marian Data 19 februarie 2011 23:30:45
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<fstream>
#define DIM 1050003
#define K 1000000
#include<vector>
using namespace std;
vector<pair<unsigned,int> >G[DIM];
int frecv1[DIM],frecv2[DIM],L,U;
unsigned v[DIM];
long long sol,n;
void solve();
void normalizare();
ofstream fout("secv5.out");
int main()
{
	ifstream fin("secv5.in");
	fin>>n>>L>>U;
	int i;
	for(i=1;i<=n;i++)
	   fin>>v[i];
	normalizare();
	solve();
	fout<<sol;
	return 0;
}
void normalizare()
{
	int i,j,k,bau=1;
	for(i=1;i<=n;i++)
	{
		int pp=0;
		k=v[i]%K;
		for(j=0;j<G[k].size() && pp==0;j++)
		   if(G[k][j].first==v[i])
		     v[i]=G[k][j].second,pp=1;
		if(!pp)
		{
			G[k].push_back(make_pair(v[i],bau));
			v[i]=bau;
			bau++;
		}
			
     }
}
void solve()
{
	int Ll=0,Uu=0,i=1,ptl,ptu;
	while(Uu!=U+1 && i<=n)
	{
		if(Ll<L)
		{
		  frecv1[v[i]]++,frecv2[v[i]]++;
		  if(frecv1[v[i]]==1)
		    Ll++,Uu++;
		}
		else
		{
		   frecv2[v[i]]++;
		   if(frecv2[v[i]]==1)
		     Uu++;
		 }
		if(Ll==L && Uu==L)
		  ptl=i;
		if(Uu==U+1)
		  ptu=i-1;
		i++;         
	 }
	 if(i==n+1)
	   ptu=n;
	 else
	   frecv2[v[ptu]]--,ptu--;  
	 sol+=(ptu-ptl+1);
	 for(i=2;i<=n && ptl<=n;i++)
	 {
		 frecv1[v[i-1]]--;
		 frecv2[v[i-1]]--;
		 if(frecv1[v[i-1]]==0)
		   Ll--;
		 if(frecv2[v[i-1]]==0)
		   Uu--;  
		 while(Ll!=L && ptl<=n)
		 {
			 ptl++;
			 frecv1[v[ptl]]++,frecv2[v[ptl]]++;
			 if(frecv1[v[ptl]]==1)
			   Ll++;
			 if(frecv2[v[ptl]]==1)
			    Uu++;  
		  }
		  while(Uu==U+1 && ptu<n)
		  {
			  ptu++;
			  frecv2[v[ptu]]++;
			  if(frecv2[v[ptu]]==1)
			    Uu++;
			}
		if(ptu!=n)
		  frecv2[v[ptu]]--,ptu--;	
		if(Ll==L)
		   sol+=ptu-ptl+1;	
		}  
}