Cod sursa(job #1311032)

Utilizator fulgerulnegruFMI Ekart Dragos-Ioan fulgerulnegru Data 7 ianuarie 2015 17:24:42
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 2.36 kb
#include<fstream>
#include<vector>
#define pb push_back
#define mp make_pair
#define mod 666013
#define maxn 1048581
using namespace std;
typedef unsigned int ui;
 
ifstream fin("secv5.in");
ofstream fout("secv5.out");
 
ui n,l,u,st1,st2,lst1,lst2,ind;
ui v[maxn],f1[maxn],f2[maxn];
vector < pair<ui,ui> > h[mod];
long long sol;
 
int hash_imp(unsigned int k)
{
        return k%mod;
}
 
int search(ui x)
{
        int k=hash_imp(x);
            for(unsigned int i=0;i<h[k].size();i++)
                     if(h[k][i].first==x)
                               return h[k][i].second;
                h[k].pb(mp(x,++ind));
                    return ind;
}
 
void del_1()
{
        lst1--; f1[v[st1]]--; st1++;
}
 
void del_2()
{
        while(f2[v[st2]]>1) { f2[v[st2]]--; st2++; }
            lst2--; f2[v[st2]]--; st2++;
}
 
void formalize()
{
        while(f1[v[st1]]>1) { f1[v[st1]]--; st1++; }
}
 
void cit()
{
        ui x,i;
         
            fin>>n>>l>>u;
                st1=st2=1; lst1=lst2=0;
                    for(i=1;i<=n;i++)
                            {
                                        fin>>x;
                                                v[i]=search(x);
                                                 
                                                        if(f1[v[i]]==0) lst1++;
                                                                if(f2[v[i]]==0) lst2++;
                                                                        f1[v[i]]++; f2[v[i]]++;
                                                                         
                                                                                if(lst1==l) formalize();
                                                                                        if(lst1>l) { del_1(); formalize(); }
                                                                                                if(lst2>u) del_2();
                                                                                                 
                                                                                                        if(lst1>=l) sol+=st1-st2+1;
                                                                                                            }
}
 
int main()
{
        cit();
            fout<<sol;
                fclose(stdin);
                    fclose(stdout);
                        return 0;
}