Cod sursa(job #2881360)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 30 martie 2022 14:38:07
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <cstdio>
#include <unordered_map>

using namespace std;

const int NMAX = (1 << 20);

int n, l, u;
int v[NMAX + 5];
unordered_map<int, int> aparitii;

long long count_subsecv(int max_ap) {
  for(int i = 1; i <= n; i++)
    aparitii[ v[i] ] = 0;

  long long nr_secv = 0;
  int st = 1, dr = 0;
  int nr_distincte = 0; // cate nr distincte am in secventa curenta

  while(st <= n) {
    // Verific daca pot extinde
    if(dr < n && (st > dr || nr_distincte <= max_ap)) {
      aparitii[ v[++dr] ]++;
      if(aparitii[ v[dr] ] == 1)
        nr_distincte++;
    }
    else {
      aparitii[ v[st] ]--;
      if(aparitii[ v[st] ] == 0)
        nr_distincte--;
      st++;
    }

    // Verific daca secventa curenta e buna
    if(st <= dr && nr_distincte <= max_ap) {
      nr_secv += (dr - st + 1);
      if(dr == n)
        break;
    }
  }

  return nr_secv;
}

int main() {
  freopen("secv5.in", "r", stdin);
  freopen("secv5.out", "w", stdout);

  scanf("%d %d %d", &n, &l, &u);
  for(int i = 1; i <= n; i++)
    scanf("%d", &v[i]);

  printf("%lld", count_subsecv(u) - count_subsecv(l - 1));

  return 0;
}