Cod sursa(job #2181788)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 21 martie 2018 20:50:05
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <fstream>
#include <deque>
using namespace std;
#define nmax (1<<20)+100
ifstream f("secv5.in");
ofstream g("secv5.out");

int n,l,u,op,elem,mn;
unsigned int vect[nmax],freq[nmax],curent,last,hashes[nmax];
unsigned long long ans;

vector<unsigned int>Se;
deque<unsigned int>dif;

int main()
{
    f>>n>>l>>u;
    for (int i=1; i<=n; ++i)
    {
        f>>vect[i];
        if (find(Se.begin(),Se.end(),vect[i])==Se.end())
        {
            Se.push_back(vect[i]);
            hashes[Se.size()-1]=vect[i];
        }
    }
    for (mn=1; mn<=n&&dif.size()<l; ++mn)
    {
        unsigned int localpoz=distance(Se.begin(),find(Se.begin(),Se.end(),vect[mn]));
        if (freq[localpoz]==0)
            dif.push_back(localpoz);
        ++freq[localpoz];
    }
    for (last=mn; last<=n&&dif.size()<u; ++last)
    {
        unsigned int localpoz=distance(Se.begin(),find(Se.begin(),Se.end(),vect[last]));
        if (freq[localpoz]==0)
            dif.push_back(localpoz);
        ++freq[localpoz];
    }
    --mn;
    last=min(last,(unsigned int)n);
    if (dif.size()<l)
    {
        g<<0;
        return 0;
    }
    ans+=(last-mn+1);
    for (int i=1; i<=n; ++i)
    {
        unsigned int local=distance(Se.begin(),find(Se.begin(),Se.end(),vect[i]));
        --freq[local];
        if (freq[local]==0)
        {
            for (deque<unsigned int>::iterator w=dif.begin(); w!=dif.end(); ++w)
                if (*w==local)
                {
                    dif.erase(w);
                    break;
                }
            for (last=last+1; last<=n; ++last)
            {
                unsigned int localpoz=distance(Se.begin(),find(Se.begin(),Se.end(),vect[last]));
                if (freq[localpoz]==0)
                {
                    dif.push_back(localpoz);
                    ++freq[localpoz];
                    break;
                }
                ++freq[localpoz];
            }
            if (dif.size()>=l)
            {
                unsigned int nxtpoz=dif[l-1];
                for (;vect[mn]!=hashes[nxtpoz];++mn);
                ans+=(min(last,(unsigned int)n)-mn+1);
            }
            else
            {
                g<<ans;
                return 0;
            }
        }
        else
            ans+=(min(last,(unsigned int)n)-mn+1);
    }
    g<<ans;
    return 0;
}