Cod sursa(job #537074)

Utilizator bora_marianBora marian bora_marian Data 19 februarie 2011 23:36:57
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<fstream>
#define DIM 1050003
#define K 1000000
#include<vector>
using namespace std;
vector<pair<unsigned,int> >G[DIM];
int cx[DIM],cy[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 nx=0, ny=0, x=1, y=1;
    for(int i=1;i<=n;++i)
    {
       if (!cx[v[i]])
          ++nx;
       ++cx[v[i]];
       while (nx>=L && x<=i)
       {
          --cx[v[x]];
          if (!cx[v[x]])
             --nx;
          ++x;
        }
        if (!cy[v[i]])
             ++ny;
        ++cy[v[i]];
       while (ny>U && y<=i)
       {
           --cy[v[y]];
           if (!cy[v[y]])
              --ny;
           ++y;
         }
       if (nx==L-1 && ny<=U && ny>=L)
           sol+=x-y;
      }
}