Cod sursa(job #2246374)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 27 septembrie 2018 00:25:47
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <iostream>
#include <stdio.h>
#include <vector>

#define MOD 666013
#define NMAX 1100000

using namespace std;

struct elem {
  int val ;
  int frecv ;
};

vector <elem> has [ MOD + 1 ] ;

int v [ NMAX + 2 ] ;

int H (int x ) { return x % MOD ; }

void add (int x ) {
  elem x2 ;
  x2.val = x ;
  x2.frecv = 1 ;
  has[H(x)].push_back(x2) ;
}

void update (int x) {
  int i = H(x) ;
  vector <elem>::iterator j ;
  for (j = has[i].begin() ; j != has[i].end() && (*j).val != x ; j++ ) ;
  if (j != has[i].end() )
  (*j) = {(*j).val, (*j).frecv+1 } ;
}

void delet (int x ) {
  int i = H (x) ;
  vector <elem>::iterator j ;
  for (j = has[i].begin() ; j != has[i].end() && (*j).val != x ; j++ ) ;
  if (j != has[i].end() )
    if ((*j).frecv-1 == 0)
      has[i].erase(j) ;
    else
      (*j) = {(*j).val, (*j).frecv-1 } ;
}

bool exist (int x) { /// daca exista x cu restul i
  int i = H (x) ;
  vector <elem>::iterator j ;
  for (j = has[i].begin() ; j != has[i].end() && (*j).val != x ; j++ );
  if (j != has[i].end())
    return true ;
  return false ;
}

int main() {

  FILE *fin, *fout ;
  fin = fopen ("secv5.in", "r" ) ;
  fout = fopen ("secv5.out", "w" ) ;
  int i, j, n, u, l, count, sol1, sol2 ;
  fscanf (fin, "%d%d%d", &n, &l, &u ) ;
  for (i = 0 ; i < n ; i++ )
    fscanf (fin, "%d", &v[i] ) ;
  i = 0 ;
  j = 1 ;
  add (v[0]) ;
  count = 1 ;
  sol1 = 0 ;
  while (j < n ) {
    if (exist(v[j]) == false ) {
      if (count+1 <= u ) {
        add (v[j]) ;
        sol1 += (j - i ) ;
        j++;
        count++;
      }
      else {
        delet(v[i]) ;
        if (exist(v[i]) == false )
          count--;
        i++;
      }
    }
    else {
      update(v[j]) ;
      sol1 += (j - i ) ;
      j++;
    }
  }
  while (i < j ) {
    delet(v[i]) ;
    i++;
  }
  i = 0 ;
  j = 1 ;
  add (v[0]) ;
  count = 1 ;
  sol2 = 0 ;
  while (j < n ) {
    if (exist(v[j]) == false ) {
      if (count+1 < l ) {
        add (v[j]) ;
        sol2 += (j - i ) ;
        j++;
        count++;
      }
      else {
        delet(v[i]) ;
        if (exist(v[i]) == false )
          count--;
        i++;
      }
    }
    else {
      update(v[j]) ;
      sol2 += (j - i ) ;
      j++;
    }
  }
  fprintf (fout, "%d", sol1-sol2 ) ;
  return 0;
}