Cod sursa(job #2008617)

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

using namespace std;

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

char buff[VAL];
UI poz=0;

UI citeste()
{
    UI nr=0;
    while (buff[poz]<'0' || buff[poz]>'9')
      if (++poz==VAL)
        fread(buff, 1, VAL, stdin), poz=0;
    while ('0'<=buff[poz] && buff[poz]<='9')
    {
        nr=nr*10+buff[poz]-'0';
        if (++poz==VAL)
          fread(buff, 1, VAL, stdin), poz=0;
    }
    return nr;
}

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    N=citeste();
    L=citeste();
    U=citeste();
    be=1;
    for (i=1; i<=N; i++)
      v[i]=citeste();
    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;
    }
    printf("%lld\n", ANS);
    return 0;
}