Pagini recente » Istoria paginii preoji2016/clasament/11-12 | Cod sursa (job #369840) | Cod sursa (job #2823742) | Rating h4xalot (UPB_Manea_Leu_Anghel) | Cod sursa (job #9890)
Cod sursa(job #9890)
#include <stdio.h>
#include <algorithm>
#define MaxN 1100000
using namespace std;
unsigned n, p, u, nr, l1, l2, dif1, dif2;
unsigned a[MaxN], nou[MaxN], nr1[MaxN], nr2[MaxN];
unsigned long long big, val[MaxN];
char ok[MaxN];
void brute()
{
int sol=0;
int i,j,k;
for (i=0; i<n; i++){
memset(ok, 0, nr);
int dif=0;
for (j=i; j<n; j++){
if (!ok[a[j]]) dif++;
ok[a[j]]=1;
if (p<=dif && dif<=u) sol++;
}
}
printf("%d\n", sol);
}
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;
}
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;
for (i=0; i<n; i++)
scanf("%d", a+i);
nr=n;
big=((long long) 1)<<22;
for (i=0; i<n; i++) val[i]=a[i]*big + i;
sort(val, val+n);
for (i=0; i<n; i++) val[i] &= (big-1);
nr=0;
nou[val[0]]=nr;
for (i=1; i<n; nou[val[i]]=nr, i++)
if (a[val[i-1]] != a[val[i]]) nr++;
memcpy(a, nou, 4*n);
nr++;
brute();
// smart();
return 0;
}