Cod sursa(job #2008615)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 7 august 2017 00:11:27
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 1.44 kb
#include <fstream>
#include <unordered_map>
#define VAL 1050005
#define UI unsigned int

using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

UI N, L, U, i, j;
UI v[VAL], a[VAL];
UI b[VAL], be, nr;
long long ANS;
unordered_map <UI, UI> H;

int main()
{
    fin >> N >> L >> U;
    be=1;
    for (i=1; i<=N; i++)
      fin >> v[i];
    i=0;
    while (nr<U)
    {
        i++;
        if (i>N)
          break;
        H[v[i]]++;
        if (H[v[i]]==1)
          nr++;
    }
    a[i]=1;
    be=1;
    while (i<N)
    {
        i++;
        H[v[i]]++;
        if (H[v[i]]==1)
          nr++;
        while (nr>U)
        {
            H[v[be]]--;
            if (H[v[be]]==0)
              nr--;
            be++;
        }
        a[i]=be;
    }
    H.clear();
    i=0;
    nr=0;
    while (nr<L)
    {
        i++;
        if (i>N)
          break;
        H[v[i]]++;
        if (H[v[i]]==1)
          nr++;
    }
    be=1;
    for (j=i; j<=N; j++)
    {
        while (nr>=L)
        {
            H[v[be]]--;
            if (H[v[be]]==0)
              nr--;
            be++;
        }
        be--;
        nr++;
        H[v[be]]++;
        b[j]=be;
        H[v[j+1]]++;
        if (H[v[j+1]]==1)
          nr++;
    }
    for (i=1; i<=N; i++)
    {
        if (a[i]==0 && b[i]>0)
          ANS+=b[i];
        if (a[i]>0 && b[i]>0)
          ANS+=b[i]-a[i]+1;
    }
    fout << ANS << '\n';
    fin.close();
    fout.close();
    return 0;
}