Cod sursa(job #775676)

Utilizator darrenRares Buhai darren Data 8 august 2012 17:40:34
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

const int MOD = 3013;
vector<pair<unsigned, int> > V[MOD];
int valnow = 0;

int add(unsigned val)
{
	int vmod = val % MOD;
	for (vector<pair<unsigned, int> >::iterator it = V[vmod].begin(); it != V[vmod].end(); ++it)
		if (it->first == val)
			return it->second;
	V[vmod].push_back(make_pair(val, ++valnow));
	return valnow;
}

char parse[1 << 16];
int pnow;
inline void verify()
{
	if (parse[pnow] == 0)
	{
		fin.get(parse, 1 << 16, '\0');
		pnow = 0;
	}
}
unsigned get()
{
	while (!(parse[pnow] >= '0' && parse[pnow] <= '9'))
	{
		++pnow;
		verify();
	}
	unsigned number = 0;
	while (parse[pnow] >= '0' && parse[pnow] <= '9')
	{
		number = number * 10 + (parse[pnow] - '0');
		++pnow;
		verify();
	}
	return number;
}

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()
{
	verify();
	
	N = get(), L = get(), U = get();
	for (int i = 1; i <= N; ++i)
	{
		A[i] = get();
		A[i] = add(A[i]);
	}
	
	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();
}