Cod sursa(job #9894)

Utilizator goguGogu Marian gogu Data 27 ianuarie 2007 18:53:12
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <stdio.h>
#include <algorithm>
#define MaxN 1100000

using namespace std;

int n, p, u, nr, l1, l2, dif1, dif2;
unsigned a[MaxN], nou[MaxN], nr1[MaxN], nr2[MaxN];
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("%u", 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;
}