Cod sursa(job #2628550)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 16 iunie 2020 12:26:58
Problema Secventa 5 Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>
#define maxn (1<<20)+5

#define MAXIM 1000000


std::ofstream fout ("secv5.out");


char buff[MAXIM+2];
int poz=MAXIM-1;
inline void cit(unsigned &nr){
    while(buff[poz]<'0' || buff[poz]>'9'){//nu e cifra
         poz++;
         if(poz==MAXIM){
           fread(buff,1,MAXIM,stdin);
           poz=0;
         }
   }
   nr=0;
   while(buff[poz]>='0' && buff[poz]<='9'){
        nr=nr*10+buff[poz]-'0';
        poz++;
         if(poz==MAXIM){
           fread(buff,1,MAXIM,stdin);
           poz=0;
         }
   }
}

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

std::map <unsigned int, int> mp;

int main()
{
    freopen ("secv5.in","r",stdin);
    unsigned int aux;
    int n, min, max, i, j, k=1, diff=0;
    cit(aux); n = aux;
    cit(aux); min = aux;
    cit(aux); max = aux;

    for (i=0; i<n; i++){
        cit(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;
}