Cod sursa(job #72739)

Utilizator andrei_infoMirestean Andrei andrei_info Data 15 iulie 2007 12:40:34
Problema Divk Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <stdlib.h>

#define max 500000


typedef struct pnod{ int poz; pnod *next; } pnod;

int a[max],n, aa,bb,k;
int s[max];
pnod *v[100000];

void citire()
{
        pnod *p;

        freopen("divk.in", "r", stdin);
        scanf("%d %d %d %d\n", &n, &k, &aa, &bb);

        for (int i = 1; i<=n ; i++)
        {
                scanf("%d\n",&a[i]);
                s[i] = s[i-1] + a[i];
        }

        p=new pnod;
        p->poz = 0;
        p->next = v[0];
        v[0] = p;

        for (int i = n; i>0; i--)
        {
                p=new pnod;
                p->poz = i;
                p->next = v[s[i] % k];
                v[s[i] % k] = p;
        }
        fclose(stdin);
}

int calc(int lung)
{
        pnod *p1, *p2;
        int nr = 0, rez=0;
        int dif;
        for (int i = 0; i<k; i++, nr=0)
        {
                p1 = v[i];
                if (p1 == NULL ) continue;
                p2 = p1;
                dif = 0;
                while (p2->next != NULL )
                {
                        p2 = p2->next;
                        dif++;
                        while ( p2->poz - p1->poz + 1 >= lung )
                        {
                                p1 = p1->next;
                                dif--;
                        }
                        nr += dif;
                        
                }
                rez +=nr;
        }
        return rez;
}


int main()
{
        citire();

        int rez,r1,r2;
        r1=calc(bb);
        //if (aa > 2)
        r2=calc(aa);
        //else r2=0;
        rez = r1-r2;
        freopen("divk.out","w", stdout);
        printf("%d", rez);
        fclose(stdout);

}