Cod sursa(job #2881405)

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

using namespace std;

class InParser {

private:
  static const int BUFF_SIZE = 1 << 17;
  int cursor;
  char buff[BUFF_SIZE];
  FILE *in_file;

  char get_char() {
    if(cursor == BUFF_SIZE) {
      fread(buff, sizeof(buff[0]), BUFF_SIZE, in_file);
      cursor = 0;
    }
    return buff[cursor++];
  }

public:
  InParser(const char *filename) {
    in_file = fopen(filename, "r");
    cursor = BUFF_SIZE;
  }

  InParser & operator >> (int &nr) {
    char ch = get_char();
    while(ch < '0' || ch > '9') ch = get_char();

    nr = 0;
    while(ch >= '0' && ch <= '9') {
      nr = nr * 10 + ch - '0';
      ch = get_char();
    }

    return *this;
  }
};

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

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

  InParser in("secv5.in");

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

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

  return 0;
}