Pagini recente » Cod sursa (job #692003) | Cod sursa (job #649085) | Cod sursa (job #2026542) | Cod sursa (job #2458310) | Cod sursa (job #10620)
Cod sursa(job #10620)
#include <stdio.h>
#include <vector>
#define MaxN (1<<20)+1
using namespace std;
int n, p, u, nr, l1, l2, dif1, dif2;
int a[MaxN];
int nr1[MaxN], nr2[MaxN];
vector <unsigned long long> val[MaxN];
int baga(unsigned x)
{
int h=x % MaxN;
int dim=val[h].size();
for (int i=0; i<dim; i++)
if (x == val[h][i]>>22) return val[h][i] & ((1<<22)-1);
nr++;
val[h].push_back(((unsigned long long) x<<22)+nr);
return nr;
}
void smart()
{
int i, j, k;
long long sol=0;
nr1[a[0]]++; nr2[a[0]]++;
dif1=dif2=1;
for (i=0; i<n; i++){
if (i){
nr1[a[i-1]]--;
if (nr1[a[i-1]]==0) dif1--;
}
while (dif1<p && l1<n-1){
l1++;
if (nr1[a[l1]]==0) dif1++;
nr1[a[l1]]++;
}
if (i){
nr2[a[i-1]]--;
if (nr2[a[i-1]]==0) dif2--;
}
while (dif2<u && l2<n-1){
l2++;
if (nr2[a[l2]]==0) dif2++;
nr2[a[l2]]++;
}
while (l2<n-1 && nr2[a[l2+1]]>0){
l2++;
nr2[a[l2]]++;
}
if (dif1>=p) sol+=l2-l1+1; else break;
}
printf("%lld\n", sol);
}
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d\n", &n, &p, &u);
int i,j,k;
char lin[50];
for (i=0; i<n; i++){
gets(lin);
k=0;
unsigned x=0;
while (lin[k]) x=x*10+lin[k++]-'0';
a[i]=baga(x);
}
smart();
return 0;
}