| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求高手查错!谢谢!线段树求高手查错!pku3468
可恶,不管我怎么测,都对,可一交就错
program dsjfbs;
type
treetype=record
lf,rf,left,right,parent,ad:longint;{线段树;lf是左边,rf是右边,left,right左右儿子,此树较特殊,中间有一个数,ad是更改量}
sum:int64;
end;
var
tree:array[0..100000]of treetype;
a:array[1..100000]of longint;
l,len,n,q,i,j,k,m:longint;
s:int64;
x:char;
procedure add(b,e,p:longint);{添加}
var
key,keyt,ll,rr,lll,rrr,tmp:longint;
begin
key:=(tree[p].lf+tree[p].rf)div 2;
if tree[p].ad<>0 then begin{标记下放}
a[key]:=a[key]+tree[p].ad;
if tree[p].left<>0 then tree[tree[p].left].ad:=tree[tree[p].left].ad+tree[p].ad;
if tree[p].right<>0 then tree[tree[p].right].ad:=tree[tree[p].right].ad+tree[p].ad;
tree[p].sum:=tree[p].sum+tree[p].ad*(tree[p].rf-tree[p].lf+1);
tree[p].ad:=0;
end;
if (b=tree[p].lf)and(e=tree[p].rf) then begin
tree[p].ad:=tree[p].ad+k;
end
else begin
tree[p].sum:=tree[p].sum+k*(e-b+1);
if (b<=key)and(e>=key) then begin{判断比较麻烦}
a[key]:=a[key]+k;
if (b=key)and(e>key) then add(key+1,e,tree[p].right)
else if (e=key)and(b<key) then add(b,key-1,tree[p].left)
else if (b<key) then begin
add(b,key-1,tree[p].left);
add(key+1,e,tree[p].right);
end;
end;
if b>key then add(b,e,tree[p].right);
if e<key then add(b,e,tree[p].left);
end;
end;
procedure fsum(b,e,p:longint);{查找}
var
key,keyt,tmp:longint;
begin
key:=(tree[p].lf+tree[p].rf)div 2;
if tree[p].ad<>0 then begin{标记下放}
a[key]:=a[key]+tree[p].ad;
if tree[p].left<>0 then tree[tree[p].left].ad:=tree[tree[p].left].ad+tree[p].ad;
if tree[p].right<>0 then tree[tree[p].right].ad:=tree[tree[p].right].ad+tree[p].ad;
tree[p].sum:=tree[p].sum+tree[p].ad*(tree[p].rf-tree[p].lf+1);
tree[p].ad:=0;
end;
if (b=tree[p].lf)and(e=tree[p].rf) then s:=s+tree[p].sum+tree[p].ad*(tree[p].rf-tree[p].lf+1)
else begin
if (b<=key)and(e>=key) then begin
s:=s+a[key];
if (b=key)and(e>key) then fsum(key+1,e,tree[p].right)
else if (e=key)and(b<key) then fsum(b,key-1,tree[p].left)
else if b<e then begin
fsum(b,key-1,tree[p].left);
fsum(key+1,e,tree[p].right);
end;
end;
if b>key then fsum(b,e,tree[p].right);
if e<key then fsum(b,e,tree[p].left);
end;
end;
begin
assign(input,'pku_3468.in');
assign(output,'pku_3468.out');
reset(input);
rewrite(output);
readln(n,q);
for i:=1 to n do read(a[i]);
readln;
build(1,n,0,0);
len:=0;
tree[0].left:=0;
for i:=1 to q do begin
read(x);
if x='C' then begin
readln(m,l,k);
add(m,l,1);
end
else begin
s:=0;
read(m);
readln(l);
fsum(m,l,1);
writeln(s);
end;
end;
close(input);
close(output);
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator