Cod sursa(job #2660795)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 20 octombrie 2020 15:47:10
Problema Secventa 5 Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
//Mihai Priboi

#include <stdio.h>
#include <stdlib.h>
#define N_MAX 1 << 20

unsigned int f[N_MAX], v[N_MAX], n;

void quicksort( int st, int dr ) {
  int i, j, mij, aux;
  mij = f[(st + dr) / 2];
  i = st;
  j = dr;
  do {
    while( i < dr && f[i] < mij ) i++;
    while( j > st && f[j] > mij ) j--;
    if( i <= j ) {
      aux = f[i];
      f[i] = f[j];
      f[j] = aux;
      i++;
      j--;
    }
  } while( i <= j );
	if( st < j ) quicksort( st, j );
	if( i < dr ) quicksort( i, dr );
}

int cautbin( int x ) {
  int r, pas;
  pas = N_MAX;
  r = 0;
  while( pas ) {
    if( r + pas < n && f[r + pas] <= x )
      r += pas;
    pas /= 2;
  }
  return r;
}

long long solve( int x ) {
  int st, dr, i, cnt;
  long long sum;
  for( i = 0; i < N_MAX; i++ )
    f[i] = 0;
  sum = cnt = st = 0;
  for( dr = 0; dr < n; dr++ ) {
    if( f[v[dr]] == 0 ) {
      while( st <= dr && cnt == x ) {
        f[v[st]]--;
        if( f[v[st]] == 0 )
          cnt--;
        st++;
      }
    }
    if( f[v[dr]] == 0 )
      cnt++;
    f[v[dr]]++;

    sum += (long long)dr - st + 1;
  }
  return sum;
}

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