[BZOJ 3038 & & BZOJ 3211] 위치 분석 라인 트 리
6310 단어 데이터 구조
코드:
type
tree=^treenode;
treenode=record
l,r,max,min:longint;
sum:int64;
ls,rs:tree;
end;
var
n,i,q,opt,l,r:longint;
delta:array[0..100100]of longint;
xtr:tree;
function max(x,y:longint):longint;
begin
if xthen exit(y)
else exit(x);
end;
function min(x,y:longint):longint;
begin
if x>y then exit(y)
else exit(x);
end;
procedure updata(x:tree);
begin
x^.max:=max(x^.ls^.max,x^.rs^.max);
x^.min:=min(x^.ls^.min,x^.rs^.min);
x^.sum:=x^.ls^.sum+x^.rs^.sum;
end;
procedure build(x:tree;l,r:longint);
var
mid:longint;
begin
x^.l:=l;
x^.r:=r;
if l=r then
begin
x^.max:=delta[l];
x^.min:=delta[l];
x^.sum:=delta[l];
x^.ls:=nil;
x^.rs:=nil;
exit;
end;
mid:=(l+r)div 2;
new(x^.ls);new(x^.rs);
build(x^.ls,l,mid);
build(x^.rs,mid+1,r);
updata(x);
end;
function ask(x:tree;l,r:longint):int64;
var
mid:longint;
begin
if (x^.l=l)and(x^.r=r) then exit(x^.sum);
mid:=(x^.l+x^.r)div 2;
if r<=mid then exit(ask(x^.ls,l,r));
if l>mid then exit(ask(x^.rs,l,r));
exit(ask(x^.ls,l,mid)+ask(x^.rs,mid+1,r));
end;
procedure change(x:tree;l,r:longint);
var
mid:longint;
begin
if (x^.max<=1)and(x^.min>=0) then exit;
if x^.l=x^.r then begin x^.sum:=trunc(sqrt(x^.sum)); x^.max:=x^.sum; x^.min:=x^.sum; exit; end;
mid:=(x^.l+x^.r)div 2;
if r<=mid then change(x^.ls,l,r)
else if l>mid then change(x^.rs,l,r)
else
begin
change(x^.ls,l,mid);
change(x^.rs,mid+1,r);
end;
updata(x);
end;
begin
readln(n);
for i:=1 to n do
read(delta[i]);
new(xtr);
build(xtr,1,n);
readln(q);
for i:=1 to q do
begin
readln(opt,l,r);
if opt=1 then writeln(ask(xtr,l,r))
else change(xtr,l,r);
end;
end.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.