Cod sursa(job #1819656)

Utilizator TincaMateiTinca Matei TincaMatei Data 30 noiembrie 2016 18:39:24
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <algorithm>

const int MAX_N = 1 << 20;
unsigned int v[MAX_N];
unsigned int* p[MAX_N];
int f[MAX_N];

bool cmp(unsigned int *a, unsigned int *b) {return *a < *b;}

void normalize(int n) {
  unsigned int j, last;
  for(int i = 0; i < n; ++i)
    p[i] = &v[i];
  std::sort(p, p + n, cmp);
  j = 0;
  last = *p[0];
  for(int i = 0; i < n; ++i) {
    if(*p[i] == last)
      *p[i] = j;
    else {
      last = *p[i];
      *p[i] = ++j;
    }
  }
}

int solveWindow(int n, int s) {
  int sized, st, dr, rez;
  st = 0;
  dr = -1;
  sized = 0;
  rez = 0;
  for(int i = 0; i < n; ++i)
    f[i] = 0;
  while(dr < n) {
    while(dr < n && sized <= s) {
      dr++;
      if(dr < n) {
        if(f[v[dr]] == 0)
          sized++;
        f[v[dr]]++;
        if(sized <= s) {
          rez = rez + dr - st + 1;
        }
      }
    }

    while(st < n && sized > s) {
      if(st < n) {
        if(f[v[st]] == 1)
          sized--;
        f[v[st]]--;
      }
      ++st;
    }
    if(st < n && dr < n && st <= dr) {
      rez = rez + dr - st + 1;
    }
  }
  return rez;
}

int main() {
  int n, l, u;
  FILE *fin = fopen("secv5.in", "r");
  fscanf(fin, "%d%d%d", &n, &l, &u);
  for(int i = 0; i < n; ++i) {
    fscanf(fin, "%u", &v[i]);
  }
  fclose(fin);

  normalize(n);

  FILE *fout = fopen("secv5.out", "w");
  fprintf(fout, "%d", solveWindow(n, u) - solveWindow(n, l - 1));
  fclose(fout);
  return 0;
}