Cod sursa(job #2657536)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 10 octombrie 2020 21:22:16
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <vector>

using namespace std;

const int NMAX = (1 << 20);
const int MOD = 666013;
unsigned int v[NMAX + 1];
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( unsigned int n, unsigned int x ){
  reset();
  unsigned 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++]);
    erase_hash(v[st++]);
    rez += 1LL * (dr - st + 1);
  }
  return rez;
}


int main() {
  int n, l, u, i;
  FILE *fin, *fout;
  fin = fopen( "secv5.in", "r" );
  fout = fopen( "secv5.out", "w" );
  fscanf( fin, "%d%d%d", &n, &l, &u );
  for( i = 1; i <= n; ++i )
    fscanf( fin, "%u", &v[i] );
  fprintf( fout, "%I64d", solve(n, u) - solve(n, l - 1) );
  fclose( fin );
  fclose( fout );
  return 0;
}