Cod sursa(job #2657546)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 10 octombrie 2020 22:17:47
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = (1 << 20);
const int MOD = 666013;
unsigned int v[NMAX + 2];
vector < pair<unsigned int, unsigned int> > myhash[MOD];
unsigned int k;

void add_hash( unsigned int x ){
  unsigned int i = 0, code = x % MOD;
  while( i < myhash[code].size() && x != myhash[code][i].first )
    ++i;
  if( i == myhash[code].size() ){
    myhash[code].push_back({x, 1});
    ++k;
  }
  else
    ++myhash[code][i].second;
}

void erase_hash( unsigned int x ){
  unsigned int i = 0, code = x % MOD;
  while( i < myhash[code].size() && x != myhash[code][i].first )
    ++i;
  if( i < myhash[code].size() ){
    --myhash[code][i].second;
    if( !myhash[code][i].second ){
      myhash[code].erase(myhash[code].begin() + i);
      --k;
    }
  }
}

bool search_hash( unsigned int x ){
  unsigned int i = 0, code = x % MOD;
  while( i < myhash[code].size() && x != myhash[code][i].first )
    ++i;
  return i < myhash[code].size();
}

void reset(){
  unsigned int i;
  i = k = 0;
  for( i = 0; i < MOD; ++i )
    myhash[i].clear();
}

long long solve( int n, int x ){
  reset();
  int st, dr;
  long long rez = 0;
  st = dr = 1;
  while( st <= n ){
    while( dr <= n && k + (1 - search_hash(v[dr])) <= x )
      add_hash(v[dr++]);
    if( k > l )
      erase_hash(v[st++]);
    rez = rez + 1LL * (dr - st + 1LL);
  }
  return rez;
}


int main() {
  ifstream fin( "secv5.in" );
  ofstream fout( "secv5.out" );
  int n, l, u, i;
  fin >> n >> l >> u;
  for( i = 1; i <= n; ++i )
    fin >> v[i];
  fout << solve(n, u) - solve(n, l - 1);
  return 0;
}