Pagini recente » Cod sursa (job #1158776) | Cod sursa (job #2889139) | Cod sursa (job #992810) | Cod sursa (job #2675377) | Cod sursa (job #858276)
Cod sursa(job #858276)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define Nmax 1100010
int N, L, U, V[Nmax];
int Dp1[Nmax], Dp2[Nmax], Freq[Nmax];
struct X
{
unsigned int V;
int P;
}W[Nmax];
bool Cmp(X A, X B)
{
if(A.V == B.V) return A.P < B.P;
return A.V < B.V;
}
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
int i, j;
scanf("%i %i %i", &N, &L, &U);
for(i = 1; i <= N; i++)
{
scanf("%u", &W[i].V);
W[i].P = i;
}
sort(W + 1, W + N + 1, Cmp);
j = 0;
for(i = 1; i <= N; i++)
{
if(W[i].V != W[i - 1].V) j ++;
V[W[i].P] = j;
}
j = 1;
int Cnt = 0;
for(i = 1; i <= N; i++)
{
while(j <= N && Cnt < L)
{
if(Freq[V[j]] == 0) Cnt ++;
Freq[V[j]] ++;
j ++;
}
if(Cnt == L) Dp1[i] = j - 1;
Freq[V[i]] --;
if(Freq[V[i]] == 0) Cnt --;
}
memset(Freq, 0, sizeof(Freq));
j = 1;
Cnt = 0;
for(i = 1; i <= N; i++)
{
while(j <= N && Cnt <= U)
{
if(Freq[V[j]] == 0) Cnt ++;
if(Cnt > U)
{
Cnt --;
break;
}
Freq[V[j]] ++;
j ++;
}
if(L <= Cnt && Cnt <= U) Dp2[i] = j - 1;
Freq[V[i]] --;
if(Freq[V[i]] == 0) Cnt --;
}
long long Ans = 0;
for(i = 1; i <= N; i++)
if(Dp1[i] != 0 && Dp2[i] != 0) Ans += 1LL * (Dp2[i] - Dp1[i] + 1);
else
{
if(Dp1[i] == 0 && Dp2[i]) Ans += 1LL * (N - Dp2[i] + 1);
else if(Dp1[i] && !Dp2[i]) Ans += 1LL * (N - Dp1[i] + 1);
}
printf("%lld\n", Ans);
return 0;
}