Cod sursa(job #2209941)

Utilizator Eduard24Eduard Scaueru Eduard24 Data 5 iunie 2018 09:33:37
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");

unsigned int v[1048580],i,j,n,u,l,k,w,nrs,nrdif;
int f1[(1<<20)+2],f2[(1<<20)+2];
struct element
{
    unsigned int val,poz;
}a[1048580];

bool cmp (element a, element b)
{
    if(a.val<b.val)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    fin>>n>>l>>u;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        a[i].val=v[i];
        a[i].poz=i;
    }
    sort(a+1,a+n+1,cmp);
    k=0;
    w=0;
    for(i=1;i<=n;i++)
    {
        if(w<a[i].val)
        {
            k++;
            w=a[i].val;
            v[a[i].poz]=k;
        }
        else
        {
            v[a[i].poz]=k;
        }
    }
    nrs=0;
    nrdif=0;
    i=1;
    j=0;
    k=0;
    while(i<=n && nrdif<l)
    {
        if(f1[v[i]]==0)
        {
            nrs=nrs+2;
        }
        nrdif++;
        f1[v[i]]++;
        f2[v[i]]++;
        i++;
    }
    if(i<n)
    {
        nrdif--;
    }
    while(j<=n && nrdif<=u)
    {
        if(f1[v[j]]==0)
        {
            nrs=nrs+2;
        }
        nrdif++;
        f1[v[j]]++;
        f2[v[j]]++;
        j++;
    }
    if(j<n)
    {
        nrdif--;
    }
    while(k<=n && nrdif<=u)
    {
        if(f2[v[k]]==0)
        {
            nrs=nrs+(k-n+1);
        }
        f2[v[k]]++;
        k++;
        nrdif++;
    }
    if(k<n)
    {
        nrdif--;
    }

    /**for(i=1;i+l-1<=n;i++)
    {
        memset(f,0,((1<<20)+2)*sizeof(int));
        nrdif=0;
        for(j=i;j<=n && nrdif<=u;j++)
        {
            if(f[v[j]]==0)
            {
                nrdif++;
                f[v[j]]=1;
            }
            if(nrdif>=l && nrdif<=u)
            {
                nrs++;
            }
        }
    }*/
    fout<<nrs;
    fin.close();
    fout.close();
    return 0;
}