Cod sursa(job #2681512)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 5 decembrie 2020 18:30:44
Problema Secventa 5 Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <map>
#include <cctype>
using namespace std;
const int NMAX = (1 << 20) + 5;
char buffer[1 << 17];
int sz = (1 << 17), crs = (1 << 17);
void get_int(int &n)
{
    for( ; crs < sz && !isdigit(buffer[crs]) ; crs ++);
    if(crs == sz)
    {
        fread(buffer, sz, 1, stdin);
        for(crs = 0 ; crs < sz && !isdigit(buffer[crs]) ; crs ++);
    }
    n = 0;
    for( ; crs < sz && isdigit(buffer[crs]) ; crs ++)
        n = n * 10 + buffer[crs] - '0';
    if(crs == sz)
    {
        fread(buffer, sz, 1, stdin);
        for(crs = 0 ; crs < sz && isdigit(buffer[crs]) ; crs ++)
            n = n * 10 + buffer[crs] - '0';
    }
}
int v[NMAX + 5];
long long secv(int n, int lim)
{
    if(lim == 0)
        return 0;
    int st, dr, cnt;
    long long nr = 0;
    map <int, int> m;
    map <int, int>::iterator it;
    cnt = 0;
    for(st = dr = 1 ; dr <= n ; dr ++)
    {
        it = m.find(v[dr]);
        if(it != m.end())
            m[v[dr]] ++;
        else
        {
            m.insert({v[dr], 1});
            cnt ++;
        }
        while(cnt > lim && st <= dr)
        {
            m[v[st]] --;
            if(m[v[st]] == 0)
            {
                m.erase(v[st]);
                cnt --;
            }
            st ++;
        }
        nr += (dr - st + 1);
    }
    return nr;
}
int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    int n, i, l, u;
    get_int(n);
    get_int(l);
    get_int(u);
    for(i = 1 ; i <= n ; i ++)
        get_int(v[i]);
    printf("%lld\n", secv(n, u) - secv(n, l - 1));
    return 0;
}