Cod sursa(job #775661)

Utilizator darrenRares Buhai darren Data 8 august 2012 17:21:42
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstring>
#include <fstream>
#include <algorithm>

using namespace std;

int N, L, U;
unsigned A[(1 << 20) + 2];
int pos[(1 << 20) + 2];
int freq[(1 << 20) + 2];

class compare
{
	public: inline bool operator () (const int& i1, const int& i2)
	{
		return A[i1] < A[i2];
	}
};

long long getS(int x)
{
	memset(freq, 0, sizeof(freq));
	
	int now = 1, different = 0;
	long long result = 0;
	
	for (int i = 1; i <= N; ++i)
	{
		while (now <= N && different + (freq[A[now]] == 0) <= x)
		{
			different += (freq[A[now]] == 0);
			++freq[A[now]];
			++now;
		}
		result += (now - i + 1);
		
		--freq[A[i]];
		if (freq[A[i]] == 0)
			--different;
	}
	
	return result;
}

int main()
{
	ifstream fin("secv5.in");
	ofstream fout("secv5.out");
	
	fin >> N >> L >> U;
	for (int i = 1; i <= N; ++i)
	{
		fin >> A[i];
		pos[i] = i;
	}
	sort(pos + 1, pos + N + 1, compare());
	
	int now = 0;
	for (int i = 1; i <= N; ++i)
	{
		++now;
		while (i < N && A[pos[i]] == A[pos[i + 1]])
		{
			A[pos[i]] = now;
			++i;
		}
		A[pos[i]] = now;
	}
	
	fout << getS(U) - getS(L - 1) << '\n';
	
	fin.close();
	fout.close();
}