Cod sursa(job #1674231)

Utilizator radarobertRada Robert Gabriel radarobert Data 4 aprilie 2016 15:16:27
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <iostream>
#include <unordered_set>

using namespace std;

unordered_multiset<unsigned> s1;
unordered_multiset<unsigned> s2;
unsigned v[2000000];

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);

    int n, l, u;
    scanf("%d%d%d", &n, &l, &u);

    int l1 = 1;
    int l2 = 1;
    int nr1 = 0, nr2 = 0;
    long long sol = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%u", &v[i]);
        if (s1.find(v[i]) == s1.end())
            nr1++;
        if (s2.find(v[i]) == s2.end())
            nr2++;
        if (nr1 > u)
        {
            for (; l1 <= n; l1++)
            {
                s1.erase(s1.find(v[l1]));
                if (s1.find(v[l1]) == s1.end())
                    break;
            }
            l1++;
            nr1--;
        }
        if (nr2 > l)
        {
            for (; l2 <= n; l2++)
            {
                s2.erase(s2.find(v[l2]));
                if (s2.find(v[l2]) == s2.end())
                    break;
            }
            l2++;
            nr2--;
        }
        s1.insert(v[i]);
        s2.insert(v[i]);

        while (s2.count(v[l2]) > 1 && l2 < i)
        {
            s2.erase(s2.find(v[l2]));
            l2++;
        }

        if (nr1 >= l)
            sol += (l2 - l1 + 1);
    }

    cout << sol << '\n';

    return 0;
}