Cod sursa(job #993132)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 3 septembrie 2013 12:42:47
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <algorithm>
#define Nmax (1<<20)

using namespace std;

int fr1[Nmax],fr2[Nmax],n,p,a[1000005],sol,l,u;

struct nr
{
	int val,poz,nv;
};
nr v[1000005];

inline bool Compara(const nr A, const nr B)
{
	return A.val<B.val;
}

inline void Normalizare()
{
	int i;
	for(i=1;i<=n;i++)
	{
		v[i].poz=i;
		v[i].val=a[i];
	}
	sort(v+1,v+n+1,Compara);
	v[1].nv = 1;
	for(i=2;i<=n;i++)
		if (v[i].val == v[i-1].val)
			v[i].nv = v[i-1].nv;
		else v[i].nv = v[i-1].nv + 1;
	for(i=1;i<=n;i++)
		a[v[i].poz]=v[i].nv;
}

int main()
{
	int i,st=1,dr1=1,dr2=1,cnt1=1,cnt2=1;
	ifstream fin("secv5.in");
	ofstream fout("secv5.out");
	fin>>n;
	for(i=1;i<=n;i++)
		fin>>a[i];
	fr1[a[1]]=fr2[a[1]]=1;
	while(dr1<=n)
	{
		if(cnt1<p)
		{
			++dr1;
			if(++fr1[a[dr1]]==1)
				++cnt1;
		}
		if(cnt2<=p && dr2<=n)
		{
			++dr2;
			if(++fr2[a[dr2]]==1)
				++cnt2;
		}
		else
		{
			sol=sol+dr2-dr1;
			if(--fr1[a[st]]==0)
				--cnt1;
			if(--fr2[a[st]]==0)
				--cnt2;
			++st;
		}
	}
	if(cnt1==p && cnt2==p+1)
		sol=sol+dr2-dr1;
	fout<<sol<<"\n";
	fout.close();
	return 0;
}