Pagini recente » Cod sursa (job #3348050) | Cod sursa (job #980018) | Cod sursa (job #1635699) | Cod sursa (job #699666) | Cod sursa (job #988947)
Cod sursa(job #988947)
#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);
}