Pagini recente » Cod sursa (job #1082064) | Cod sursa (job #2823799) | Cod sursa (job #2174120) | Cod sursa (job #2431248) | Cod sursa (job #705877)
Cod sursa(job #705877)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define nmax 1048580
#define MAXIM 1000000
#define MODULO 666013
typedef pair<unsigned,unsigned> pereche;
unsigned int v[nmax],locatie[nmax];
vector <pereche> auxiliar;
vector <pereche> hash[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;
long long f(unsigned DIF){//returneaza numarul de subsecvente cu cel mult DIF numere diferite
unsigned i,j;
unsigned aux,aux2,aux3;
unsigned dif=0;
long long secv=0;
int inceput=0;
for(i=0;i<n;i++){
//incerc sa-l bag in hash
//daca e nou (nu e deja acolo)
aux=v[i]%MODULO;
if(locatie[v[i]]==-1){//nu l-am gasit, e nou
dif++;
hash[aux].push_back(make_pair(v[i],1));
locatie[v[i]]=hash[aux].size()-1;
//printf("un nou element,%u\n",v[i]);
}else{
hash[aux][locatie[v[i]]].second++;
}
if(dif<=DIF){
secv+=i-inceput+1;
}else{
//am prea multe diferente
//trebuie sa tot scot de la inceput
while(dif>DIF){
//il scot pe v[inceput] din hash
aux=v[inceput]%MODULO;
aux3=locatie[v[inceput]];
hash[aux][aux3].second--;
if(hash[aux][aux3].second==0){
//il scot de tot
aux2=hash[aux].size()-1;
hash[aux][aux3]=hash[aux][aux2];
locatie[hash[aux][aux2].first]=locatie[v[inceput]];
hash[aux].pop_back();
locatie[v[inceput]]=-1;
dif--;
}
inceput++;
}
secv+=i-inceput+1;
}
}
//vectorul locatie trebuie resetat pe -1
for(i=0;i<nmax;i++)locatie[i]=-1;
//trebuie sa react hashul
for(i=0;i<MODULO;i++){
hash[i].clear();
}
//printf("\n***\n");
return secv;
}
int main(){
unsigned i;
unsigned li,ls;
freopen("secv5.in","r",stdin);
cit(n);
cit(li);
cit(ls);
long long aux,aux2;
for(i=0;i<n;i++){
cit(v[i]);
auxiliar.push_back(make_pair(v[i],i));
}
sort(auxiliar.begin(),auxiliar.end());
int norm=0;
for (i = 0; i < n; v[auxiliar[i++].second] = norm) { // normalizam
if (i > 0 && auxiliar[i - 1].first != auxiliar[i].first){
norm += 1;
}
}
//de acum il umplu pe locatie[v[i]] cu -1 daca v[i] nu este in hash, indicele unde il gasesc, daca este
for(i=0;i<nmax;i++){
locatie[i]=-1;
}
aux=f(ls);
aux2=f(li-1);
FILE *fout=fopen("secv5.out","w");
fprintf(fout,"%lld\n",aux-aux2);
//printf("li=%u,%lld\n",li,f(li));
return 0;
}