Cod sursa(job #59475)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 9 mai 2007 12:55:25
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

using namespace std;
#define NMAX 1 << 20
#define Q 69997

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

int N, L, U, V[NMAX], A[NMAX], sol[NMAX], nr, X;
vector<int> H[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("%d", V + i);
     H[V[i] % Q].push_back(i);
     }
}

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

     for(i = 0; i < Q; i++)
     {
     	if(H[i].size())
		sort(H[i].begin(), H[i].end(), lcmp);

          for(j = 0; j < H[i].size(); 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 rez = 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[j] == 1 ? nr - 1: nr;
                    V[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]]++;
          if(nr > X)
          {
          	for(; j <= i && nr > X; j++)
               {
               	nr = V[j] == 1 ? nr - 1: nr;
                    V[j]--;
               }
          }
          rez -= i - j + 1;
     }
     }
     printf("%lld\n", rez);
}

bool lcmp(const int &a, const int &b)
{
	return V[a] - V[b] < 0 ? true : false;
}