Cod sursa(job #728959)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 29 martie 2012 09:46:25
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iostream>
#define nmax (1<<20)+1
#define MAXIM 1000000

using namespace std;
vector <pair<unsigned,unsigned > > v;//tine datele initiale
unsigned f[nmax];//tine numarul de aparitii ale fiecarui numar pana acum
unsigned normalizat[nmax];
unsigned norm=0;  
unsigned n;


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;
         }
   }
}



long long secv(unsigned x){//returneaza numarul de secvente care au numarul de elem diferite<=x
    if(x==0)return 0;
    memset(f,0,(norm+1)*4);//setez frecventa pe 0      
    long long secv=0;
    int inceput=0;
    int i;
    long long dif=0;
    for(i=0;i<n;i++){
       if(!f[normalizat[i]])//daca nu mai aveam tipul asta de element
          dif++;
       f[normalizat[i]]++;
       //verific nr de diferente
          while(dif>x){
             f[normalizat[inceput]]--;
             if(!f[normalizat[inceput]]){
                dif--;
             }
            inceput++;
          }
          secv+=i-inceput+1;
    }
    
    return secv;
}

int main(){
   freopen ("secv5.in","r",stdin);
   ofstream fout("secv5.out");
   unsigned li,ls;
   unsigned i;
   unsigned aux;
   //fin>>n>>li>>ls;
   cit(n);
   cit(li);
   cit(ls);

   for(i=0;i<n;i++){
      //fin>>aux;
      cit(aux);
      v.push_back(make_pair(aux,i));
   }
   sort(v.begin(),v.end());
   //am sortat dupa primul cap
   aux=v[0].first;
   normalizat[v[0].second]=norm;
   for(vector<pair<unsigned,unsigned> >::iterator it=v.begin()+1;it<v.end();it++){
        if(aux!=(*it).first){
           aux=(*it).first;
           norm++;
        }
        normalizat[(*it).second]=norm;
   }


   //pana acum am normalizat
   //cout<<secv(ls)<<" "<<secv(li-1)<<endl;
   fout<<secv(ls)-secv(li-1)<<endl;
     
return 0;
}