Cod sursa(job #728785)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 28 martie 2012 23:03:54
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.62 kb
#include <stdio.h>
#include <vector>
using namespace std;
#define nmax 1048580
#define MAXIM 1000000
#define MODULO 666013
typedef pair<unsigned,unsigned> pereche;
unsigned int v[nmax];
vector <pereche> hash1[MODULO+1];
vector <pereche> hash2[MODULO+1];

char buff[MAXIM+2];
int poz=MAXIM-1;
inline void cit(unsigned &nr){
    while(buff[poz]<'0' || buff[poz]>'9'){//nu e cifra
         poz++;
         if(poz==MAXIM){
           fread(buff,1,MAXIM,stdin);
           poz=0;
         }
   }
   nr=0;
   while(buff[poz]>='0' && buff[poz]<='9'){
        nr=nr*10+buff[poz]-'0';
        poz++;
         if(poz==MAXIM){
           fread(buff,1,MAXIM,stdin);
           poz=0;
         }
   }
}

unsigned n;


int main(){
  unsigned i;
  unsigned li,ls;
  freopen("secv5.in","r",stdin);
  cit(n);
  cit(li);
  cit(ls);
  unsigned aux,aux2,aux3;
  for(i=0;i<n;i++){
    cit(v[i]);
  }

  unsigned j;
  unsigned dif1=0,dif2=0;
  long long secv1=0,secv2=0;
  int inceput1=0,inceput2=0;
  li--;
  for(i=0;i<n;i++){
    //incerc sa-l bag in HASH1
    //daca e nou (nu e deja acolo)
    aux=v[i]%MODULO;
    for(j=0;j<hash1[aux].size();j++){
       if(hash1[aux][j].first==v[i]){
           hash1[aux][j].second++;
           break;
       }
    }
    if(j==hash1[aux].size()){//nu l-am gasit, e nou
       dif1++;
       hash1[aux].push_back(make_pair(v[i],1));
       //printf("un nou element,%u\n",v[i]);
    }
    //
    if(dif1<=li){
       secv1+=i-inceput1+1;
       //printf("inceput= %d, final=%d,dif=%d, secv=%lld\n",inceput,i,dif,secv);
    }else{
       //am prea multe diferente
       //trebuie sa tot scot de la inceput
       while(dif1>li){
         //il scot pe v[inceput] din hash
         //printf("l-am scos pe v[%d]=%u\n",inceput,v[inceput]);
         aux=v[inceput1]%MODULO;
         aux3=hash1[aux].size();
         for(j=0;j<aux3;j++){
             if(hash1[aux][j].first==v[inceput1]){
                 hash1[aux][j].second--;
                 if(hash1[aux][j].second==0){//e singurul de tipul lui
                    hash1[aux][j]=hash1[aux][aux3-1];
                    hash1[aux].pop_back();
                    dif1--;
                    //printf("dif=%d\n",dif);
                 }
                break;
             }
         }
         inceput1++;
       }
       secv1+=i-inceput1+1;
    }
    //hashul 2
    aux=v[i]%MODULO;
    for(j=0;j<hash2[aux].size();j++){
       if(hash2[aux][j].first==v[i]){
           hash2[aux][j].second++;
           break;
       }
    }
    if(j==hash2[aux].size()){//nu l-am gasit, e nou
       dif2++;
       hash2[aux].push_back(make_pair(v[i],1));
       //printf("un nou element,%u\n",v[i]);
    }
    //
    if(dif2<=ls){
       secv2+=i-inceput2+1;
       //printf("inceput= %d, final=%d,dif=%d, secv=%lld\n",inceput,i,dif,secv);
    }else{
       //am prea multe diferente
       //trebuie sa tot scot de la inceput
       while(dif2>ls){
         //il scot pe v[inceput] din hash
         //printf("l-am scos pe v[%d]=%u\n",inceput,v[inceput]);
         aux=v[inceput2]%MODULO;
         aux3=hash2[aux].size();
         for(j=0;j<aux3;j++){
             if(hash2[aux][j].first==v[inceput2]){
                 hash2[aux][j].second--;
                 if(hash2[aux][j].second==0){//e singurul de tipul lui
                    hash2[aux][j]=hash2[aux][aux3-1];
                    hash2[aux].pop_back();
                    dif2--;
                    //printf("dif=%d\n",dif);
                 }
                break;
             }
         }
         inceput2++;
       }
       secv2+=i-inceput2+1;
    }
}

  FILE *fout=fopen("secv5.out","w");
  fprintf(fout,"%lld\n",secv2-secv1);
  //printf("li=%u,%lld\n",li,f(li));
return 0;
}