| ||||||||||
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