Cod sursa(job #2628547)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 16 iunie 2020 12:20:45
Problema Secventa 5 Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <bits/stdc++.h>
#define maxn (1<<20)+5

class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;

	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}

public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}

	InParser& operator >> (unsigned int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}

	InParser& operator >> (int &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};
std::ofstream fout ("secv5.out");

unsigned int x[maxn];
int posMin[maxn], posMax[maxn];
int freq[maxn];

std::map <int, int> mp;

int main()
{


    InParser fin ("secv5.in");
    int n, min, max, i, j, k=1, diff=0;
    fin >> n >> min >> max;

    for (i=0; i<n; i++){
        fin >> x[i];
        if (mp[x[i]] == 0){
            mp[x[i]] = k;
            x[i] = k++;
        }
        else
            x[i] = mp[x[i]];
    }

    for (i=0, j=-1, diff=0; i<n; i++){
        while (diff < min and j < n-1){
            j ++;
            if (freq[x[j]] == 0)
                diff ++;
            freq[x[j]] ++;
        }
        if (diff == min)
            posMin[i] = j;
        else
            posMin[i] = -1;
        if (freq[x[i]] == 1)
                diff--;
        freq[x[i]] --;
    }

    for (i=0, j=-1, diff=0; i<n; i++){
        while (diff < max and j < n-1){
            j ++;
            if (freq[x[j]] == 0)
                diff ++;
            freq[x[j]] ++;
        }
        while (j < n-1 and freq[x[j+1]] != 0){
            j++;
            freq[x[j]] ++;
        }
        if (diff <= max)
            posMax[i] = j;
        else
            posMax[i] = -1;
        if (freq[x[i]] == 1)
                diff--;
        freq[x[i]] --;
    }

    long long ans = 0;
    for (i=0; i<n; i++){
        if (posMin[i] != -1 and posMin[i] <= posMax[i])
            ans += posMax[i] - posMin[i] + 1;
    }
    /*
    for (i=0; i<n; i++)
        fout << posMin[i] << ' ';
    fout << '\n';
    for (i=0; i<n; i++)
        fout << posMax[i] << ' ';
        */
    fout << ans << '\n';

    return 0;
}