Pagini recente » Cod sursa (job #55145) | Cod sursa (job #253589) | Cod sursa (job #883321) | Cod sursa (job #1566614) | Cod sursa (job #2628543)
#include <bits/stdc++.h>
#define maxn (1<<20)+5
std::ifstream fin ("secv5.in");
std::ofstream fout ("secv5.out");
int x[maxn];
int posMin[maxn], posMax[maxn];
int freq[maxn];
std::map <int, int> mp;
int main()
{
int n, min, max, i, j, k=1, diff=0;
fin >> n >> min >> max;
for (i=0; i<n; i++){
fin >> x[i];
if (mp[x[i]] == 0){
mp[x[i]] = k;
x[i] = k++;
}
else
x[i] = mp[x[i]];
}
for (i=0, j=-1, diff=0; i<n; i++){
while (diff < min and j < n-1){
j ++;
if (freq[x[j]] == 0)
diff ++;
freq[x[j]] ++;
}
if (diff == min)
posMin[i] = j;
else
posMin[i] = -1;
if (freq[x[i]] == 1)
diff--;
freq[x[i]] --;
}
for (i=0, j=-1, diff=0; i<n; i++){
while (diff < max and j < n-1){
j ++;
if (freq[x[j]] == 0)
diff ++;
freq[x[j]] ++;
}
while (j < n-1 and freq[x[j+1]] != 0){
j++;
freq[x[j]] ++;
}
if (diff <= max)
posMax[i] = j;
else
posMax[i] = -1;
if (freq[x[i]] == 1)
diff--;
freq[x[i]] --;
}
long long ans = 0;
for (i=0; i<n; i++){
if (posMin[i] != -1 and posMin[i] <= posMax[i])
ans += posMax[i] - posMin[i] + 1;
}
/*
for (i=0; i<n; i++)
fout << posMin[i] << ' ';
fout << '\n';
for (i=0; i<n; i++)
fout << posMax[i] << ' ';
*/
fout << ans << '\n';
return 0;
}