Cod sursa(job #993279)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 3 septembrie 2013 16:24:26
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <algorithm>
#define Nmax 1048586
#define Lim 1000000
#define In "secv5.in"
#define Out "secv5.out"
#define Next ++pos == Lim ? f.read (Buffer, Lim), pos = 0 : 0
#define PII pair< int ,int >
#define val first
#define poz second
using namespace std;

int fr1[Nmax],fr2[Nmax], a[Nmax],n, p, sol, u,pos;
PII v[Nmax];
ifstream f(In);
char Buffer[Lim];
inline void Read(int &x)
{
    for(     ;!('0' <= Buffer[pos] && Buffer[pos]<='9');Next);
    for(x = 0;('0' <= Buffer[pos] && Buffer[pos]<='9');Next)
        x = x*10+Buffer[pos]-'0';
}

inline void Read()
{
    f.read(Buffer,Lim);
    Read(n);Read(p);Read(u);
    for(int i = 1;i <= n; ++i)
    {
        Read(a[i]);
        v[i].val = a[i];
        v[i].poz = i;
    }
}
inline void Normalizare()
{
    sort(v+1,v+n+1);
    for(int i = 1;i <= n; ++i)
        a[v[i].poz] = a[v[i-1].poz]+!(v[i].val==v[i-1].val);
}

inline void Write()
{
    ofstream g(Out);
    g<<sol<<"\n";
    g.close();
}

inline void Solve()
{
    int st=1,dr1=1,dr2=1,cnt1=1,cnt2=1;
    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+=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;
}

int main()
{
    Read();
    Normalizare();
    Solve();
    Write();
    return 0;
}