Cod sursa(job #1321100)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 18 ianuarie 2015 19:32:26
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 1.46 kb
#include<stdio.h>
#include<string.h>
#define f first
#define s second
#include<vector>
using namespace std;
#define prim 666013
#define nmax 1<<20

int n,lin,nr=-1,v[1<<nmax],f[1<<nmax];
unsigned int val;
vector< pair<unsigned int,int> > h[prim+2];

int cautare()
{
    lin=val%prim;
    int i,lim=h[lin].size();
    for(i=0;i<lim;i++)
        if(val==h[lin][i].f)
            return i;
    return -1;
}

int insert()
{
    int poz=cautare();
    if(poz==-1)
    {
        h[lin].push_back(make_pair(val,++nr));
        return nr;
    }
    return h[lin][poz].s;
}

long long calc(int x)
{
    if(x==0)
        return 0;
    int i,poz=0,nr=1;
    long long sol=1;
    f[v[0]]=1;
    for(i=1;i<n;i++)
    {
        f[v[i]]++;
        if(f[v[i]]==1)
            nr++;
        while(nr>x)
        {
            f[v[poz]]--;
            if(f[v[poz]]==0)
                nr--;
            poz++;
        }
//      printf("sol inainte de %d e %lld\n",i,sol);
        sol=sol+i-poz+1;
//      printf("sol la pasul %d e %lld\n",i,sol);
    }
    return sol;
}

int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    int p,u;
    scanf("%d%d%d",&n,&p,&u);
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%u",&v[i]);
        val=v[i];
        v[i]=insert();
    }
    long long sol=calc(u);
    memset(f,0,sizeof(f));
    sol=sol-calc(p-1);
    printf("%lld\n",sol);
    return 0;
}