Cod sursa(job #2628566)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 16 iunie 2020 13:09:42
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 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::vector <std::pair <unsigned int, int>> v;

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]);
        v.push_back ({x[i], i});
    }

    std::sort (v.begin(), v.end());
    int last = v[0].first;
    x[v[0].second] = 1;
    for (i=1; i<n; i++){
        if (v[i].first == last)
            x[v[i].second] = x[v[i-1].second];
        else{
            x[v[i].second] = x[v[i-1].second] + 1;
            last = v[i].first;
        }
    }

    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;
}