Cod sursa(job #858244)

Utilizator visanrVisan Radu visanr Data 18 ianuarie 2013 18:39:16
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

#define Nmax 1100010

int N, L, U, V[Nmax];
int Dp1[Nmax], Dp2[Nmax], Freq[Nmax];
struct X
{
    int V, P;
}W[Nmax];

bool Cmp(X A, X B)
{
    if(A.V == B.V) return A.P < B.P;
    return A.V < B.V;
}

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    int i, j;
    scanf("%i %i %i", &N, &L, &U);
    for(i = 1; i <= N; i++)
    {
        scanf("%i", &V[i]);
        W[i].V = V[i];
        W[i].P = i;
    }
    sort(W + 1, W + N + 1, Cmp);
    j = 0;
    for(i = 1; i <= N; i++)
    {
        if(W[i].V != W[i - 1].V) j ++;
        V[W[i].P] = j;
    }
    j = 2;
    int Cnt = 1;
    Freq[V[1]] = 1;
    for(i = 1; i <= N; i++)
    {
        while(j <= N && Cnt < L)
        {
            if(Freq[V[j]] == 0) Cnt ++;
            Freq[V[j]] ++;
            j ++;
        }
        if(Cnt == L) Dp1[i] = j - 1;
        Freq[V[i]] --;
        if(Freq[V[i]] == 0) Cnt --;
    }
    memset(Freq, 0, sizeof(Freq));
    j = 2;
    Cnt = 1;
    Freq[V[1]] = 1;
    for(i = 1; i <= N; i++)
    {
        while(j <= N && Cnt <= U)
        {
            if(Freq[V[j]] == 0) Cnt ++;
            Freq[V[j]] ++;
            j ++;
        }
        if(Cnt == U) Dp2[i] = j - 1;
        Freq[V[i]] --;
        if(Freq[V[i]] == 0) Cnt --;
    }
    int Ans = 0;
    for(i = 1; i <= N; i++)
        if(Dp1[i] != 0 && Dp2[i] != 0) Ans += Dp2[i] - Dp1[i] + 1;
        else
        {
            if(Dp1[i] == 0 && Dp2[i]) Ans += N - Dp2[i] + 1;
            else if(Dp1[i] && !Dp2[i]) Ans += N - Dp1[i] + 1;
        }
    printf("%i\n", Ans);
    return 0;
}