Pagini recente » Cod sursa (job #1834219) | Cod sursa (job #46318) | Cod sursa (job #1710962) | Cod sursa (job #1510535) | Cod sursa (job #594773)
Cod sursa(job #594773)
#include <cstdio>
#include <vector>
using namespace std;
vector <unsigned int> hl[200003],hr[200003];
unsigned int v[1048577];
int main()
{
unsigned int sol=0,n,l=1,r=1,cnt=0,p,q,a,i,j,ok,ind=0;
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%u %u %u\n",&n,&p,&q);
//part1
//
for (i=1;i<=n&&cnt<p;++i)
{
scanf("%u\n",&v[i]);
a=v[i]%200003;
for (j=0;j<hl[a].size();++j)
if (hl[a][j]==v[i])
break;
if (j==hl[a].size())
++cnt;
hl[a].push_back(v[i]);
hr[a].push_back(v[i]);
}
a=v[1]%200003;
while (v[r+1]==v[r]&&r<=i)
{
++r;
for (j=0;j<hr[a].size();++j)
if (hr[a][j]==v[r])
{
hr[a][j]=hr[a][hr[a].size()-1];
hr[a].pop_back();
break;
}
}
sol+=r;
//part2
//
for (;i<=n&&cnt<q;++i)
{
scanf("%u\n",&v[i]);
a=v[i]%200003;
for (j=0;j<hr[a].size();++j)
if (hr[a][j]==v[i])
break;
if (j==hr[a].size())
{
++cnt;
for (ok=1;ok;++r,ind=0)
{
ok=0;
a=v[r]%200003;
for (j=0;j<hr[a].size();++j)
if (hr[a][j]==v[r])
{
++ok;
ind=j;
}
hr[a][ind]=hr[a][hr[a].size()-1];
hr[a].pop_back();
--ok;
}
a=v[r]%200003;
while (v[r+1]==v[r]&&r<=i)
{
++r;
for (j=0;j<hr[a].size();++j)
if (hr[a][j]==v[r])
{
hr[a][j]=hr[a][hr[a].size()-1];
hr[a].pop_back();
break;
}
}
}
hl[v[i]%200003].push_back(v[i]);
hr[v[i]%200003].push_back(v[i]);
sol+=r;
}
//part3a
//
for (;i<=n;++i)
{
scanf("%u\n",&v[i]);
a=v[i]%200003;
for (j=0;j<hr[a].size();++j)
if (hr[a][j]==v[i])
break;
if (j==hr[a].size())
{
++cnt;
for (ok=1;ok;++r,ind=0)
{
ok=0;
a=v[r]%200003;
for (j=0;j<hr[a].size();++j)
if (hr[a][j]==v[r]&&!ok)
{
++ok;
ind=j;
}
hr[a][ind]=hr[a][hr[a].size()-1];
hr[a].pop_back();
--ok;
while (v[r+1]==v[r]&&r<=i)
{
++r;
for (j=0;j<hr[a].size();++j)
if (hr[a][j]==v[r])
{
hr[a][j]=hr[a][hr[a].size()-1];
hr[a].pop_back();
break;
}
}
}
}
//part3b
//
for (j=0;j<hl[a].size();++j)
if (hl[a][j]==v[i])
break;
if (j==hl[a].size())
{
++cnt;
for (ok=1;ok;++l,ind=0)
{
ok=0;
a=v[l]%200003;
for (j=0;j<hl[a].size();++j)
if (hl[a][j]==v[l])
{
++ok;
ind=j;
}
hl[a][ind]=hl[a][hl[a].size()-1];
hl[a].pop_back();
--ok;
}
}
hl[v[i]%200003].push_back(v[i]);
hr[v[i]%200003].push_back(v[i]);
sol+=r-l+1;
}
//
printf("%u\n",sol);
return 0;
}