Cod sursa(job #1768250)

Utilizator cella.florescuCella Florescu cella.florescu Data 30 septembrie 2016 16:26:40
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define BUFF_SIZE (1<<17)
#define MAXN (1<<20)

using namespace std;

int p = BUFF_SIZE - 1;
char buff[BUFF_SIZE];

inline void next_char(FILE *fin) {
  if (++p == BUFF_SIZE) {
    fread(buff, 1, BUFF_SIZE, fin);
    p = 0;
  }
}

inline int get_num(FILE *fin) {
  int num = 0;
  while (isdigit(buff[p]) == 0)
    next_char(fin);
  while (isdigit(buff[p])) {
    num = num*10 + buff[p] - '0';
    next_char(fin);
  }
  return num;
}

int v[MAXN], freq[MAXN+1];

struct Chestie {
  int val, pos;
} aux[MAXN];

int comp(Chestie A, Chestie B) {
  return A.val < B.val;
}

long long count_subseq(int n, int u) {
  long long ans = 0LL;
  int i, j, dist = 0;
  memset(freq, 0, sizeof(freq));
  for (i = j = 0; i < n; ++i) {
    if (freq[v[i]] == 0)
      ++dist;
    freq[v[i]]++;
    while (dist > u) {
      freq[v[j]]--;
      if (freq[v[j]] == 0)
        --dist;
      ++j;
    }
    ans += 1LL*(i - j + 1);
  }
  return ans;
}

int main()
{
    FILE *fin, *fout;
    int n, l, u, i, normval;
    fin = fopen("secv5.in", "r");
    n = get_num(fin); l = get_num(fin); u = get_num(fin);
    for (i = 0; i < n; ++i)
      aux[i] = {get_num(fin), i};
    fclose(fin);
    sort(aux, aux+n, comp);
    v[aux[0].pos] = normval = 1;
    for (i = 1; i < n; ++i) {
      if (aux[i - 1].val < aux[i].val)
        ++normval;
      v[aux[i].pos] = normval;
    }
    fout = fopen("secv5.out", "w");
    fprintf(fout, "%lld\n", count_subseq(n, u) - count_subseq(n, l - 1));
    fclose(fout);
    return 0;
}