Cod sursa(job #728931)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 29 martie 2012 09:35:39
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iostream>
#define nmax (1<<20)+1
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;  
int n;

long long secv(unsigned x){//returneaza numarul de secvente care au numarul de elem diferite<=x
    if(x==0)return 0;
    memset(f,0,nmax*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]]==0){
                dif--;
             }
            inceput++;
          }
          secv+=i-inceput+1;
    }
    
    return secv;
}

int main(){
   ifstream fin("secv5.in");
   ofstream fout("secv5.out");
   unsigned li,ls;
   unsigned i;
   unsigned aux;
   fin>>n>>li>>ls;
   for(i=0;i<n;i++){
      fin>>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;
}