Cod sursa(job #993248)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 3 septembrie 2013 15:48:24
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
#define Nmax 1048580
 
using namespace std;
 
int fr1[Nmax],fr2[Nmax],n,p,u;
long long sol;
unsigned long long a[Nmax];
 
struct nr
{
    int val,poz,nv;
};
nr v[Nmax];
 
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,j,st=1,dr1=1,dr2=1,cnt1=1,cnt2=1;
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    fin>>n>>p>>u;
    for(i=1;i<=n;i++)
        fin>>a[i];
	fin.close();
	Normalizare();
    fr1[a[1]]=fr2[a[1]]=1;
    while(dr1<=n)
    {
        if(cnt1<p)
        {
            ++dr1;
            if(++fr1[a[dr1]]==1)
                ++cnt1;
        }
        if(cnt2<=u && dr2<n)
        {
            ++dr2;
            if(++fr2[a[dr2]]==1)
                ++cnt2;
        }
		else
			if(cnt1>=p && cnt2<=u+1)
			{
				sol=sol+dr2-dr1;
				/*for(i=dr1;i<=dr2;i++)
				{
					for(j=st;j<=i;j++)
						fout<<a[j]<<" ";
					fout<<"\n";
				}*/
				if(cnt2<=u)
					sol++;
				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;
}