Pagini recente » Cod sursa (job #2446376) | Cod sursa (job #1124396) | Cod sursa (job #1176365) | Cod sursa (job #1699387) | Cod sursa (job #11885)
Cod sursa(job #11885)
using namespace std;
#include<fstream>
#include<stdio.h>
#define nmax 1024*1024+5
#define cst 1000003
unsigned int a[nmax],v[nmax];
int c[nmax],poz[nmax],pp[nmax];
struct nod{unsigned int v;int poz;nod* next;};
typedef nod* list;
list ha[1000005],hz[1000005];
int main()
{
FILE *fin=fopen("secv5.in","r"),
*fout=fopen("secv5.out","w");
int n,p,q;
int i,j,k;
unsigned int aux;
fscanf(fin,"%d%d%d",&n,&p,&q);
for(i=1;i<=n;i++) fscanf(fin,"%ud",&a[i]);
//hashingul
int nn=0;
list kk;
for(i=1;i<=n;i++)
{
kk=ha[a[i]%cst];
while(kk&&kk->v!=a[i]) kk=kk->next;
if(kk)
poz[i]=kk->poz;
else
{
int r=a[i]%cst;
if(ha[r]==NULL)
ha[r]=hz[r]=new nod;
else
{
hz[r]->next=new nod;
hz[r]=hz[r]->next;
}
hz[r]->v=a[i];
hz[r]->poz=++nn;
hz[r]->next=NULL;
poz[i]=nn;
}
}
memset(c,0,sizeof c);
//primu punct
int ndist=0;
k=1;
for(i=1;i<=n;i++)
{
//bag a[i]
c[poz[i]]++;
//verificare
if(c[poz[i]]==1)
ndist++;
//mutare primu punct
while(ndist>q)
{
c[poz[k]]--;
if(c[poz[k]]==0) ndist--;
k++;
}
//retinere
pp[i]=k;
}
for(i=k;i<=n;i++)
c[poz[i]]=0;
//ultimu punct
k=1;
ndist=0;
long long sol=0;
for(i=1;i<=n;i++)
{
//bag a[i]
c[poz[i]]++;
if(c[poz[i]]==1) ndist++;
while(ndist>p-1)
{
c[poz[k]]--;
if(c[poz[k]]==0) ndist--;
k++;
}
sol+=(long long)k-(long long)pp[i];
}
fprintf(fout,"%lld\n",sol);
fclose(fin);
fclose(fout);
return 0;
}