Cod sursa(job #11885)

Utilizator moga_florianFlorian MOGA moga_florian Data 2 februarie 2007 09:27:52
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
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;
}