Cod sursa(job #58220)

Utilizator goguGogu Marian gogu Data 4 mai 2007 18:16:40
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#define MaxN ((1<<20)+100)
#define MOD 312711
#define Dim 50000
#define cit(x) x=0; while (lin[poz]<'0') {poz++; if (poz==Dim) fread(lin, 1, Dim, stdin), poz=0;} \
          while (lin[poz]>='0'){x=10*x+lin[poz++]-'0';     \
          if (poz==Dim) fread(lin, 1, Dim, stdin), poz=0; }   

using namespace std;

typedef struct {
        unsigned key;
        int poz;
} num;

int n, p, u, nr, poz=0;
int a[MaxN], aloc=MOD;
int nr1[MaxN], nr2[MaxN], next[MaxN+MOD];
num val[MaxN+MOD];
char lin[Dim];

int baga(unsigned x)
{
     int h=x % MOD;
     while (next[h]){
         if (x == val[h].key) return val[h].poz;
         h=next[h];
     }
     next[h]=aloc++;
     nr++;
     val[h].poz=nr; val[h].key=x;
     return nr;
}

void smart()
{
     long long sol=0;
     int l1=0, l2=0, dif1=1, dif2=1;
     nr1[a[0]]++; nr2[a[0]]++;
     for (int 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);
    fread(lin, 1, Dim, stdin);
    for (int i=0; i<n; i++){
        unsigned x=0;
        cit(x);
        a[i]=baga(x);
    }
    smart();
    return 0;
}