Pagini recente » Cod sursa (job #925140) | Cod sursa (job #1575832)
#include<fstream>
#include<algorithm>
#include<deque>
using namespace std;
deque<int> q;
struct xx
{
int a;
int b;
int c;
};
xx x[1100000];
int n, i, l, u, nr, v[1100000], topp, L[1100000];
long long sol;
int cmp(xx a, xx b)
{
return a.a<b.a;
}
int cmp2(xx a, xx b)
{
return a.b<b.b;
}
ifstream in("secv5.in");
ofstream out("secv5.out");
int main()
{
in>>n>>l>>u;
for(i=1; i<=n; i++)
{
in>>x[i].a;
x[i].b=i;
}
sort(x+1, x+n+1, cmp);
for(i=1; i<=n; i++)
{
if(x[i].a!=x[i-1].a)
nr++;
x[i].c=nr;
}
sort(x+1, x+n+1, cmp2);
nr=0;
for(i=1; i<=n; i++)
{
if(v[x[i].c]==0)
{
nr++;
}
v[x[i].c]++;
q.push_back(i);
while(nr>u)
{
topp=q.front();
v[x[topp].c]--;
if(v[x[topp].c]==0)
nr--;
q.pop_front();
}
L[i]=q.front();
}
for(i=1; i<=n; i++)
{
v[x[i].c]=0;
sol+=(long long) i-L[i]+1;
L[i]=0;
}
while(!q.empty())
{
q.pop_front();
}
topp=q.front();
//q.clear();
q.erase(q.begin(), q.end());
topp=q.front();
nr=0;
for(i=1; i<=n; i++)
{
if(v[x[i].c]==0)
{
nr++;
}
v[x[i].c]++;
q.push_back(i);
while(nr>l-1)
{
topp=q.front();
v[x[topp].c]--;
if(v[x[topp].c]==0)
nr--;
q.pop_front();
}
if(!q.empty())
L[i]=q.front();
else
L[i]=0;
}
for(i=1; i<=n; i++)
{
if(L[i]!=0)
sol-=(long long) i-L[i]+1;
}
out<<sol;
return 0;
}