Cod sursa(job #2729200)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 24 martie 2021 13:57:11
Problema Secventa 5 Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <unordered_map>
#define uint unsigned int

using namespace std;

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

const uint N_MAX = (1ULL << 20);

int n, l, u, ans;
int dp[N_MAX + 10], lower[N_MAX + 10], upper[N_MAX + 10]; //  sum[N_MAX + 10];
uint v[N_MAX + 10];
unordered_map<uint, uint> fr;

void calculate(int bound, int arr[], bool smallGroup)
{
    fr.clear();

    int nrDif = 0, j = 0;

    if(smallGroup)
        bound--;

    for(int i = 1; i <= n; i++)
    {
        if(fr[v[i]] == 0)
            nrDif++;

        fr[v[i]]++;

        while(nrDif > bound)
        {
            fr[v[j]]--;

            if(fr[v[j]] == 0U)
                nrDif--;

            j++;
        }

        if(!smallGroup && nrDif == bound && j == 0U)
            j = 1;

        if(smallGroup && j > 0U)
            arr[i] = j - 1;
        else
            arr[i] = j;
    }
}

int main()
{
    in >> n >> l >> u;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    calculate(u, upper, 0);
    calculate(l, lower, 1);

    for(int i = 1; i <= n; i++)
    {
        //cout << i << ' ' << lower[i] << ' ' << upper[i] << '\n';

        if(upper[i] == 0 && lower[i] == 0)
            continue;

        dp[i] = dp[i - 1] + (lower[i] - max(0, (upper[i] - 1)));

        //cout << dp[i] << '\n';

        //sum[i] = sum[i - 1] + dp[i];
    }

    out << dp[n] << '\n';

    return 0;
}