Pagini recente » Cod sursa (job #2221861) | Cod sursa (job #2835027) | Cod sursa (job #462715) | Cod sursa (job #230347) | Cod sursa (job #652750)
Cod sursa(job #652750)
#include <fstream>
#include <vector>
using namespace std;
const char InFile[]="secv5.in";
const char OutFile[]="secv5.out";
const int MaxN=1<<20;
const int HASH_MOD=350377;
ifstream fin(InFile);
ofstream fout(OutFile);
struct HashElement
{
HashElement(int value=0, int count=0):value(value),count(count){}
int value;
int count;
};
unsigned int N,L,U,st,dif,v[MaxN];
long long sol;
vector<HashElement> H[HASH_MOD];
inline void AddHash(unsigned int value)
{
unsigned int key=value%HASH_MOD;
for(vector<HashElement>::iterator it=H[key].begin();it!=H[key].end();++it)
{
if(it->value==value)
{
++it->count;
return;
}
}
H[key].push_back(HashElement(value,1));
++dif;
}
inline void DeleteHash(unsigned int value)
{
unsigned int key=value%HASH_MOD;
for(vector<HashElement>::iterator it=H[key].begin();it!=H[key].end();++it)
{
if(it->value==value)
{
--it->count;
if(it->count==0)
{
*it=H[key][H[key].size()-1];
H[key].pop_back();
--dif;
}
return;
}
}
}
int main()
{
fin>>N>>L>>U;
for(register unsigned int i=0;i<N;++i)
{
fin>>v[i];
AddHash(v[i]);
while(dif>U)
{
DeleteHash(v[st]);
++st;
}
sol+=i-st+1;
}
fin.close();
while(st<N)
{
DeleteHash(v[st]);
++st;
}
dif=0;
st=0;
--L;
for(register unsigned int i=0;i<N;++i)
{
AddHash(v[i]);
while(dif>L)
{
DeleteHash(v[st]);
++st;
}
sol-=i-st+1;
}
fout<<sol;
fout.close();
return 0;
}