Cod sursa(job #993280)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 3 septembrie 2013 16:24:26
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <algorithm>
#define Nmax 1048580
 
using namespace std;
 
int fr1[Nmax],fr2[Nmax],n,p,u,a[Nmax];
long long sol;
unsigned long long t[Nmax];
 
struct nr
{
    int poz,nv;
	unsigned long long val;
	bool operator <(const nr &A) const
    {
		return val<A.val;
    }
};
nr v[Nmax];
 
inline void Normalizare()
{
    int i;
    for(i=1;i<=n;i++)
    {
        v[i].poz=i;
        v[i].val=t[i];
    }
    sort(v+1,v+n+1);
    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,poz;
	unsigned long long aux;
	char sir[25];
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    fin>>n>>p>>u;fin.get();
    for(i=1;i<=n;i++)
	{
		fin.getline(sir,20);
		aux=0;
		for(poz=0;sir[poz];poz++)
			aux=aux*10+sir[poz]-'0';
		t[i]=aux;
	}
	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;
				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;
}