Cod sursa(job #1575832)

Utilizator TibixbAndrei Tiberiu Tibixb Data 21 ianuarie 2016 21:29:00
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<fstream>
#include<algorithm>
#include<deque>
using namespace std;
deque<int> q;
struct xx
{
    int a;
    int b;
    int c;
};
xx x[1100000];
int n, i, l, u, nr, v[1100000], topp, L[1100000];
long long sol;
int cmp(xx a, xx b)
{
    return a.a<b.a;
}
int cmp2(xx a, xx b)
{
    return a.b<b.b;
}
ifstream in("secv5.in");
ofstream out("secv5.out");
int main()
{
    in>>n>>l>>u;
    for(i=1; i<=n; i++)
    {
        in>>x[i].a;
        x[i].b=i;
    }
    sort(x+1, x+n+1, cmp);
    for(i=1; i<=n; i++)
    {
        if(x[i].a!=x[i-1].a)
            nr++;
        x[i].c=nr;
    }
    sort(x+1, x+n+1, cmp2);
    nr=0;
    for(i=1; i<=n; i++)
    {
        if(v[x[i].c]==0)
        {
            nr++;
        }
        v[x[i].c]++;
        q.push_back(i);
        while(nr>u)
        {
            topp=q.front();
            v[x[topp].c]--;
            if(v[x[topp].c]==0)
                nr--;
            q.pop_front();
        }
        L[i]=q.front();
    }
    for(i=1; i<=n; i++)
    {
        v[x[i].c]=0;
        sol+=(long long) i-L[i]+1;
        L[i]=0;
    }
    while(!q.empty())
    {
        q.pop_front();
    }
    topp=q.front();
    //q.clear();
    q.erase(q.begin(), q.end());
    topp=q.front();
    nr=0;
    for(i=1; i<=n; i++)
    {
        if(v[x[i].c]==0)
        {
            nr++;
        }
        v[x[i].c]++;
        q.push_back(i);
        while(nr>l-1)
        {
            topp=q.front();
            v[x[topp].c]--;
            if(v[x[topp].c]==0)
                nr--;
            q.pop_front();
        }
        if(!q.empty())
            L[i]=q.front();
        else
            L[i]=0;
    }
    for(i=1; i<=n; i++)
    {
        if(L[i]!=0)
            sol-=(long long) i-L[i]+1;
    }
    out<<sol;
    return 0;
}