Cod sursa(job #2628543)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 16 iunie 2020 12:14:48
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <bits/stdc++.h>
#define maxn (1<<20)+5
std::ifstream fin ("secv5.in");
std::ofstream fout ("secv5.out");

int x[maxn];
int posMin[maxn], posMax[maxn];
int freq[maxn];

std::map <int, int> mp;

int main()
{
    int n, min, max, i, j, k=1, diff=0;
    fin >> n >> min >> max;

    for (i=0; i<n; i++){
        fin >> x[i];
        if (mp[x[i]] == 0){
            mp[x[i]] = k;
            x[i] = k++;
        }
        else
            x[i] = mp[x[i]];
    }

    for (i=0, j=-1, diff=0; i<n; i++){
        while (diff < min and j < n-1){
            j ++;
            if (freq[x[j]] == 0)
                diff ++;
            freq[x[j]] ++;
        }
        if (diff == min)
            posMin[i] = j;
        else
            posMin[i] = -1;
        if (freq[x[i]] == 1)
                diff--;
        freq[x[i]] --;
    }

    for (i=0, j=-1, diff=0; i<n; i++){
        while (diff < max and j < n-1){
            j ++;
            if (freq[x[j]] == 0)
                diff ++;
            freq[x[j]] ++;
        }
        while (j < n-1 and freq[x[j+1]] != 0){
            j++;
            freq[x[j]] ++;
        }
        if (diff <= max)
            posMax[i] = j;
        else
            posMax[i] = -1;
        if (freq[x[i]] == 1)
                diff--;
        freq[x[i]] --;
    }

    long long ans = 0;
    for (i=0; i<n; i++){
        if (posMin[i] != -1 and posMin[i] <= posMax[i])
            ans += posMax[i] - posMin[i] + 1;
    }
    /*
    for (i=0; i<n; i++)
        fout << posMin[i] << ' ';
    fout << '\n';
    for (i=0; i<n; i++)
        fout << posMax[i] << ' ';
        */
    fout << ans << '\n';

    return 0;
}