Cod sursa(job #1569481)

Utilizator Ionut228Ionut Calofir Ionut228 Data 15 ianuarie 2016 16:55:35
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <cstring>
#include <unordered_map>

using namespace std;

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

char sir[101];
int N, L, U;
unsigned int V[1100000];
unordered_map<unsigned int, int> H;

long long max_secv(int M)
{
    H.clear();

    long long sol = 0;
    int lg = 0, dist = 0, pos = 1;

    for (int i = 1; i <= N; ++i)
    {
        if (H[V[i]])
        {
            ++H[V[i]];
            ++lg;
            sol += 1LL * lg;
        }
        else
        {
            ++H[V[i]];
            ++dist;
            ++lg;

            if (dist > M)
            {
                while (dist > M)
                {
                    --H[V[pos]];
                    if (!H[V[pos]])
                    {
                        --dist;
                        H.erase(V[pos]);
                    }

                    --lg;
                    ++pos;
                }
            }

            sol += 1LL * lg;
        }
    }

    return sol;
}

void parsare()
{
    fin.getline(sir + 1, 101);
    int lg = strlen(sir + 1), pos = 1;

    while (sir[pos] != ' ')
    {
        N = N * 10 + int(sir[pos] - '0');
        ++pos;
    }

    ++pos;
    while (sir[pos] != ' ')
    {
        L = L * 10 + int(sir[pos] - '0');
        ++pos;
    }

    ++pos;
    while (pos <= lg)
    {
        U = U * 10 + int(sir[pos] - '0');
        ++pos;
    }
}

int main()
{
    parsare();
    for (int i = 1; i <= N; ++i)
    {
        fin.getline(sir + 1, 101);
        int lg = strlen(sir + 1);

        for (int j = 1; j <= lg; ++j)
            V[i] = V[i] * 10 + int(sir[j] - '0');
    }

    fout << max_secv(U) - max_secv(L - 1) << '\n';

    return 0;
}