Cod sursa(job #858281)

Utilizator visanrVisan Radu visanr Data 18 ianuarie 2013 19:16:27
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 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
{
    unsigned int V;
    int P;
}W[Nmax];

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

FILE* fin = fopen("secv5.in", "r");
FILE* fout = fopen("secv5.out", "w");
const int maxb = 1000000;
char buf[maxb];
int ptr = 0;

inline int GetInt(int Type)
{
    unsigned int nr = 0;
    while(buf[ptr] < '0' || '9' < buf[ptr])
        if(++ ptr >= maxb) fread(buf, maxb, 1, fin), ptr = 0;
    while('0' <= buf[ptr] && buf[ptr] <= '9')
    {
        nr = nr * 10 + (unsigned int)buf[ptr] - '0';
        if(++ ptr >= maxb) fread(buf, maxb, 1, fin), ptr = 0;
    }
    if(Type == 1) return int(nr);
    else return nr;
}
int main()
{
    int i, j;
    N = GetInt(1);
    L = GetInt(1);
    U = GetInt(1);
    for(i = 1; i <= N; i++)
    {
        W[i].V = GetInt(2);
        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 = 1;
    int Cnt = 0;
    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 --;
    }
    for(i = 1; i <= N; i++) Freq[i] = 0;
    j = 1;
    Cnt = 0;
    for(i = 1; i <= N; i++)
    {
        while(j <= N && Cnt <= U)
        {
            if(Freq[V[j]] == 0) Cnt ++;
            if(Cnt > U)
            {
                Cnt --;
                break;
            }
            Freq[V[j]] ++;
            j ++;
        }
        if(L <= Cnt && Cnt <= U) Dp2[i] = j - 1;
        Freq[V[i]] --;
        if(Freq[V[i]] == 0) Cnt --;
    }
    long long Ans = 0;
    for(i = 1; i <= N; i++)
        if(Dp1[i] != 0 && Dp2[i] != 0) Ans += 1LL * (Dp2[i] - Dp1[i] + 1);
        else
        {
            if(Dp1[i] == 0 && Dp2[i]) Ans += 1LL * (N - Dp2[i] + 1);
            else if(Dp1[i] && !Dp2[i]) Ans += 1LL * (N - Dp1[i] + 1);
        }
    fprintf(fout, "%lld\n", Ans);
    return 0;
}