Cod sursa(job #2881375)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 30 martie 2022 14:41:42
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <unordered_map>

using namespace std;

const int NMAX = (1 << 20);

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

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() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  fin >> n >> l >> u;
  for(int i = 1; i <= n; i++)
    fin >> v[i];

  fout << count_subsecv(u) - count_subsecv(l - 1);

  return 0;
}