Cod sursa(job #988947)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 24 august 2013 13:13:44
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<fstream>
#include<cstring>
#include<string>
using namespace std;
typedef unsigned int intt;
typedef struct celula{
             intt val,newval;
             celula *next;
             }*lista;
const intt mod=666013;
lista hash[666013];
intt a[1050000],aux[1050000],s;
int i,n,l,u,h[1050000],nr;
string st;

void baga(intt x) {
     intt poz=x%mod; bool ok=1;
     for (lista p=hash[poz]; p; p=p->next)
      if (p->val==x) { ok=0; break; }
     if (ok) { ++nr; lista v=new celula; v->val=x; v->newval=nr; v->next=hash[poz]; hash[poz]=v; }
}

int newvalue(intt x) {
    intt poz=x%mod;
     for (lista p=hash[poz]; p; p=p->next)
      if (p->val==x) return(p->newval);
}

long long solve(int lim) {
     long long sol=0; int nr=0,p=0;
     for (int i=1; i<=n; ++i){
         
          while (nr<=lim&&p<=n) {
                 ++p;
                 ++h[a[p]];
                 if (h[a[p]]==1) ++nr;
                 }
           h[a[p]]=0; --p; --nr; sol+=p-i+1;
           --h[a[i]]; if (h[a[i]]==0) --nr;
          }
     return(sol);
}

intt transforma(){
    intt x=0;
    while (st[s]!='\n') { x=x*10+intt(st[s])-48; ++s; }
    ++s;
    return(x);
}

int main(void) {
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    fin>>n>>l>>u; getline(fin,st); getline(fin,st,char(EOF)); st+='\n';
    for (i=1; i<=n; ++i) { a[i]=transforma(); aux[i]=a[i]; baga(a[i]); }
    //normalizare
      for (i=1; i<=n; ++i) a[i]=newvalue(a[i]);
    //calculez cite segvente au maxim u elemente distincte si cite au l-1 elemente distincte
    long long sol1, sol2;
     sol1=solve(u); memset(h,0,sizeof(h));
     sol2=solve(l-1);
    fout<<sol1-sol2;
 return(0);
}