Pagini recente » Cod sursa (job #1573920) | Cod sursa (job #2548789) | Cod sursa (job #1146943) | Cod sursa (job #705088) | Cod sursa (job #858281)
Cod sursa(job #858281)
#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;
}
FILE* fin = fopen("secv5.in", "r");
FILE* fout = fopen("secv5.out", "w");
const int maxb = 1000000;
char buf[maxb];
int ptr = 0;
inline int GetInt(int Type)
{
unsigned int nr = 0;
while(buf[ptr] < '0' || '9' < buf[ptr])
if(++ ptr >= maxb) fread(buf, maxb, 1, fin), ptr = 0;
while('0' <= buf[ptr] && buf[ptr] <= '9')
{
nr = nr * 10 + (unsigned int)buf[ptr] - '0';
if(++ ptr >= maxb) fread(buf, maxb, 1, fin), ptr = 0;
}
if(Type == 1) return int(nr);
else return nr;
}
int main()
{
int i, j;
N = GetInt(1);
L = GetInt(1);
U = GetInt(1);
for(i = 1; i <= N; i++)
{
W[i].V = GetInt(2);
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 --;
}
for(i = 1; i <= N; i++) Freq[i] = 0;
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);
}
fprintf(fout, "%lld\n", Ans);
return 0;
}