Cod sursa(job #72737)

Utilizator andrei_infoMirestean Andrei andrei_info Data 15 iulie 2007 12:14:10
Problema Divk Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.75 kb
//infoarena divk
const max = 500000;
type plist = ^tlist;
        tlist = record
                x:longint;
                next:plist;
                end;
        rr = record
                head,last:plist;
                end;
var a: array[1..max] of longint;
    s: array[0..max] of int64;
    v: array[0..100000] of rr;
    n,aa,bb,k,rez:longint;
    f:text;
    c:char;


procedure add(lista,i:longint);
var p:plist;
begin
        new(p); p^.x:=i; p^.next:=nil;
        if v[lista].head = nil then
                v[lista].head:=p
        else v[lista].last^.next:=p;
        v[lista].last:=p;
end;

function getnn:longint;
var rez:longint;
    neg: boolean;
begin
rez:=0; neg:=false;
if c = '-' then begin neg:=true; read(f,c); end;
while ((ord(c) >=48) and (ord(c) <= 57)) do
        begin
        rez:=rez*10 + ord(c) - 48;
        read(f,c);
        end;
if neg then rez:=-rez;
getnn:=rez;
while (((ord(c)  < 48) or ( ord(c) > 57))) and ( ord(c) <> 26) and ( c <> '-')  do
       read(f,c);
end;


procedure citire;
var i:longint;
    buf : array[1..65535] of byte;
begin
assign(f,'divk.in'); reset(f); settextbuf(f,buf);
readln(f,n,k,aa,bb);
add(0,0);
for i:=1 to n do
        begin
        readln(f,a[i]);
        //a[i] :=getnn;
        s[i]:=s[i-1]+a[i];
        add(s[i] mod k,i);
        end;
close(input);
end;

procedure calc;
var i,nr:longint;
        p1,p2:plist;
begin
for i:=0 to k-1 do
        begin

        nr:=0;
        p1:=v[i].head;
        while p1 <> nil do
                begin
                p2:=p1^.next;
                nr:=0;
                while (p2 <> nil )  and (p2^.x-p1^.x <=bb) do
                  begin
                        if  (p2^.x-p1^.x >=aa ) then
                        inc(nr);
                        p2:=p2^.next;
                  end;
                rez:=rez+nr;
                p1:=p1^.next;
                end;


        end;

end;

{function calc ( lung : longint ) : int64;
var p1,p2 : plist;
    nr,dif, rez:  int64;
    i:longint;
begin
rez:=0;

for i:=0 to k-1 do
        begin
        nr:=0;
        p1 := v[i].head;
        if p1 = nil then continue;
        p2 := p1^.next;
        dif := 0;

        while ( p2 <> nil ) do
        begin
                while (p2 <> nil) and (p2^.x - p1^.x +1 <=lung ) do
                begin
                        inc(dif);
                        nr:=nr+dif;
                        p2:=p2^.next;
                end;

                p1:=p1^.next;
                dif:=dif-1;
        end;
        rez:=rez+nr;
        end;
calc:=rez;
end;}

begin
citire;
calc;
assign(output,'divk.out'); rewrite(output);
//writeln(calc(bb)-calc(aa-1));
writeln(rez);
close(output);
end.