Cod sursa(job #10170)

Utilizator astronomyAirinei Adrian astronomy Data 27 ianuarie 2007 22:49:23
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <time.h>
using namespace std;

#define MAX_N ((1 << 20)+16)

typedef long long llong;

int N, U, L, Ind, Nr_unu[MAX_N], Nr_doi[MAX_N], Pos[MAX_N];

unsigned X[MAX_N], V[MAX_N];

llong res;

int get_pos(unsigned x)
{
    int st = 1, dr = Ind, m, r;
    while(st <= dr)
    {
        m = (st+dr) >> 1;
        if(V[m] <= x)
            r = m, st = m+1;
        else
            dr = m-1;
    }
    return r;
}

void solve(void)
{
    int i, p, q, t, aux, cnt_unu = 0, cnt_doi;
    unsigned x, v;

    for(i = 1; i <= N; i++)
        Pos[i] = get_pos(X[i]);

    p = q = 1, cnt_unu = cnt_doi = 1, t = Pos[1];
    Nr_unu[t]++, Nr_doi[t]++;

    if(L == 1)
        res++;

    for(i = 2; i <= N; i++)
    {
        x = X[i], t = aux = Pos[i];
        if(Nr_unu[t] == 0)
        {
            cnt_unu++;
            Nr_unu[t]++;
            if(cnt_unu == L)
            {
                while( Nr_unu[t = Pos[p]] >= 2 )
                    Nr_unu[t]--, p++;
            }
            if(cnt_unu > L)
            {
                while(p < i)
                {
                    Nr_unu[t = Pos[p++]]--;
                    if(Nr_unu[t] == 0)
                        break ;
                }
                while( Nr_unu[t = Pos[p]] >= 2 )
                    Nr_unu[t]--, p++;
            }
        }
        else
        {
            Nr_unu[t]++;
            if(cnt_unu >= L)
                while( Nr_unu[t = Pos[p]] >= 2 )
                    Nr_unu[t]--, p++;
        }
        t = aux;
        if(Nr_doi[t] == 0)
        {
            cnt_doi++;
            Nr_doi[t]++;
            if(cnt_doi > U)
            {
                while(q < i)
                {
                    Nr_doi[t = Pos[q++]]--;
                    if(Nr_doi[t] == 0)
                        break ;
                }
            }
        }
        else
            Nr_doi[t]++;

        if(cnt_unu >= L)
            res += (llong)(p-q+1);
    }
}

void read_data(void)
{
    int i, ind;
    unsigned x;
    char sir[1024];
    
    scanf("%d %d %d\n", &N, &L, &U);

    for(i = 1; i <= N; i++)
    {
        fgets(sir, 1024, stdin), ind = 0, x = 0;
        for(; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
            x = x*10+(unsigned)(sir[ind]-48);
        X[i] = x, V[i] = x;
    }

    sort(V+1, V+N+1);

    for(ind = 1, i = 2; i <= N; i++)
     if(V[i] != V[ind])
        V[++ind] = V[i];

    Ind = ind;
}

void write_data(void)
{
    printf("%lld\n", res);
}

int main(void)
{
    freopen("secv5.in", "rt", stdin);
    freopen("secv5.out", "wt", stdout);

    //int start = clock(), end;
    
    read_data();
    solve();
    write_data();

   // end = clock();

  //  fprintf(stderr, "%lf\n", (double)(end-start) / CLK_TCK);

    return 0;
}