Cod sursa(job #59481)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 9 mai 2007 13:29:57
Problema Secventa 5 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define NMAX 1 << 20
#define Q 10003
#define nd(a) (*(int *)(a))

void read();
void solve();
int lcmp(const void *a, const void *b);

int N, L, U, A[NMAX], sol[NMAX], nr, X;
long long V[NMAX];
int *H[Q], nrv[Q];

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

     read();
     solve();
	return 0;
}

void read()
{
	scanf("%d%d%d", &N, &L, &U);

     for(int i = 0; i < N; i++)
     {
     scanf("%lld", V + i);
	nrv[V[i] % Q]++;
     }
}

void solve()
{
     int u = -1, i, j;

     for(i = 0; i < Q; i++)
     H[i] = new int[nrv[i] + 1], nrv[i] = 0;

     for(i = 0; i < N; i++)
     	H[V[i] % Q][nrv[V[i] % Q]++] = i;
          
     for(i = 0; i < Q; i++)
     {
     	if(nrv[i])
		qsort(H[i], nrv[i], sizeof(int), lcmp);

          for(j = 0; j < nrv[i]; j++)
          {
          	if(!j || V[H[i][j - 1]] != V[H[i][j]])
               u++;
               A[H[i][j]] = u;
          }
     }

	/*memset(V, 0, sizeof(V));

     long long rezz = 0;
     
     for(i = 0; i < N; i++)
     {
     	nr = 0;
          memset(V, 0, sizeof(V));
	     for(j = i; j < N; j++)
          {
          	if(V[A[j]] == 0) nr++;
          	V[A[j]]++;
               if(nr >= L && nr <= U)
               rezz++;
          }
     }
     printf("%lld\n", rezz);*/

     memset(V, 0, sizeof(V));
     long long rez = 0;

     nr = 0;
     X = U;
     rez++, V[A[0]]++, nr++;
     for(i = 1, j = 0; i < N; i++)
     {
		nr = V[A[i]] == 0 ? nr + 1 : nr;
          V[A[i]]++;
          if(nr > X)
          {
          	for(; j <= i && nr > X; j++)
               {
               	nr = V[A[j]] == 1 ? nr - 1: nr;
                    V[A[j]]--;
               }
          }
          rez += i - j + 1;
     }
     
	for(; j < N; j++)
     V[A[j]]--;
     
     nr = 0;
     X = L - 1;
     if(!X);
     else
     {
     rez--, V[A[0]]++, nr++;
     for(i = 1, j = 0; i < N; i++)
     {
		nr = V[A[i]] == 0 ? nr + 1 : nr;
          V[A[i]]++;
         	for(; j <= i && nr > X; j++)
          {
             	nr = V[A[j]] == 1 ? nr - 1: nr;
               V[A[j]]--;
          }
          rez -= i - j + 1;
     }
     }
     printf("%lld\n", rez);
}

int lcmp(const void *a, const void *b)
{
	return V[nd(a)] - V[nd(b)];
}