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