Cod sursa(job #1674249)

Utilizator radarobertRada Robert Gabriel radarobert Data 4 aprilie 2016 15:37:32
Problema Secventa 5 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <cstdio>
#include <iostream>
#include <unordered_set>
#include <vector>

using namespace std;

const int MOD = 666013;

class Hash
{
    vector< pair<int, int> > v[MOD+10];

    public:
    void insert(int x)
    {
        int i = x % MOD;
        bool found = false;
        for (auto &it: v[i])
            if (it.first == x)
            {
                found = true;
                it.second++;
                break;
            }
        if (!found)
            v[i].push_back(make_pair(x, 1));
    }

    void erase(int x)
    {
        int i = x % MOD;
        for (int j = 0; j < v[i].size(); j++)
            if (v[i][j].first == x)
            {
                v[i][j].second--;
                if (v[i][j].second == 0)
                    v[i].erase(v[i].begin() + j);
                break;
            }
    }

    int count(int x)
    {
        int i = x % MOD;
        for (auto &it: v[i])
            if (it.first == x)
                return it.second;
        return 0;
    }
};

Hash h1, h2;
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 (h1.count(v[i]) == 0)
            nr1++;
        if (h2.count(v[i]) == 0)
            nr2++;
        if (nr1 > u)
        {
            for (; l1 <= n; l1++)
            {
                h1.erase(v[l1]);
                if (h1.count(v[l1]) == 0)
                    break;
            }
            l1++;
            nr1--;
        }
        if (nr2 > l)
        {
            for (; l2 <= n; l2++)
            {
                h2.erase(v[l2]);
                if (h2.count(v[l2]) == 0)
                    break;
            }
            l2++;
            nr2--;
        }
        h1.insert(v[i]);
        h2.insert(v[i]);

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

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

    cout << sol << '\n';

    return 0;
}