Cod sursa(job #858189)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 18 ianuarie 2013 17:36:58
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <cstdio>
#include <fstream>
#include <algorithm>

#define MAX 1050000

using namespace std;

int N, L, U, lCnt, rCnt, poz;
long long sol;
unsigned int aux[MAX], V[MAX];
int leftAp[MAX], rightAp[MAX];
char buff[MAX];

inline void add(int val, int V[], int &cnt)
{
    if(V[val]++ == 0) cnt++;
}

inline void rmv(int val, int V[], int &cnt)
{
    if(--V[val] == 0) cnt--;
}

void cit(unsigned int &X)
{
    X = 0;
    while(buff[poz] < '0' || buff[poz] > '9')
        if(++poz == MAX) fread(buff, 1, MAX, stdin), poz = 0;
    while(buff[poz] >= '0' && buff[poz] <= '9')
    {
        X = X * 10 + buff[poz++] - '0';
        if(poz == MAX) fread(buff, 1, MAX, stdin), poz = 0;
    }
}

void cit(int &X)
{
    X = 0;
    while(buff[poz] < '0' || buff[poz] > '9')
        if(++poz == MAX) fread(buff, 1, MAX, stdin), poz = 0;
    while(buff[poz] >= '0' && buff[poz] <= '9')
    {
        X = X * 10 + buff[poz++] - '0';
        if(poz == MAX) fread(buff, 1, MAX, stdin), poz = 0;
    }
}

int main()
{
    freopen("secv5.in", "r", stdin); fread(buff, 1, MAX, stdin); cit(N); cit(L); cit(U);
    for(int i = 1; i <= N; i++) cit(V[i]), aux[i] = V[i];
    fclose(stdin); sort(aux + 1, aux + N + 1); aux[0] = 1;
    for(int i = 2; i <= N; i++) if(aux[aux[0]] != aux[i]) aux[++aux[0]] = aux[i];
    for(int i = 1; i <= N; i++) V[i] = lower_bound(aux + 1, aux + aux[0] + 1, V[i]) - aux;
    for(int i = 1, left = 1, right = 1; i <= N && (right <= N || rCnt >= L); i++)
    {
        for(; left <= N; left++)
        {
            add(V[left], leftAp, lCnt);
            if(lCnt == L)
            {
                rmv(V[left], leftAp, lCnt);
                break;
            }
        }
        for(; right <= N && rCnt <= U; right++)
        {
            add(V[right], rightAp, rCnt);
            if(rCnt > U)
            {
                rmv(V[right], rightAp, rCnt);
                break;
            }
        }
        sol += (right - left);
        rmv(V[i], leftAp, lCnt); rmv(V[i], rightAp, rCnt);
    }
    ofstream out("secv5.out"); out<<sol<<"\n"; out.close();
    return 0;
}