Pagini recente » Cod sursa (job #2560741) | Cod sursa (job #813) | Sandbox (cutiuţa cu năsip) | zz | Cod sursa (job #652799)
Cod sursa(job #652799)
#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=1<<24;
const unsigned int HASH_MASK=(1<<24)-1;
ifstream fin(InFile);
ofstream fout(OutFile);
struct HashElement
{
HashElement(unsigned int value=0, unsigned int count=0):value(value),count(count){}
unsigned int value;
unsigned int count;
};
unsigned int N,L,U,st,dif,v[MaxN];
long long sol;
char *ptr,buffer[11534469];
vector<HashElement> H[HASH_MOD];
inline void AddHash(unsigned int value)
{
unsigned int key=value&HASH_MASK;
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_MASK;
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;
}
}
}
inline unsigned int Number()
{
while(!('0'<=*ptr && *ptr<='9'))
{
++ptr;
}
unsigned int sol=0;
while('0'<=*ptr && *ptr<='9')
{
sol*=10;
sol+=*ptr-'0';
++ptr;
}
return sol;
}
int main()
{
streambuf *pbuf=fin.rdbuf();
fin.seekg(0, ios::end);
unsigned int BUFFERSIZE=(int)(fin.tellg());
ptr=buffer;
fin.seekg(0, ios::beg);
pbuf->sgetn(buffer,BUFFERSIZE);
fin.close();
N=Number();
L=Number();
U=Number();
for(register unsigned int i=0;i<N;++i)
{
v[i]=Number();
AddHash(v[i]);
while(dif>U)
{
DeleteHash(v[st]);
++st;
}
sol+=i-st+1;
}
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;
}