線段樹 例六 未解決

2021-07-11 22:14:26 字數 2438 閱讀 3809

題目大意

在乙個n*n的方格中,開始每個格仔裡的數都是0。現在動態地提出一些問題和修改:提問的形式是求某乙個特定的子矩陣(x1,y1)-(x2,y2)中所有元素的和;修改的規則是指定某乙個格仔(x,y),在(x,y)中的格仔元素上加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1≤n≤1024,提問和修改的總數可能達到60000條。

分析我有乙個超時的演算法:把每一行都建一棵線段樹(f[x])(x為行)(f[x]為一行的情況)

統計(x,y)(x1,y1)時把f[x]…f[x1]的線段樹區間[y,y1]加在一起。

但超時。

type

pnode=^tnode;

tnode=record

lc,rc:pnode;

c:longint;

end;

var f:array[0..1200] of pnode;

i,j,k:longint;

x,y,x1,y1:longint;

n,m:longint;

co:longint;

s:longint;

ans:longint;

procedure neww(var t:pnode);

begin

if t=nil then

begin

new(t);

t^.c:=0;

t^.lc:=nil;

t^.rc:=nil;

end;

end;

procedure insert(var t:pnode; l,r,x,y,co:longint);

var i,j,k:longint;

mid:longint;

begin

with t^ do

begin

c:=c+co;

mid:=(l+r) div 2;

if (l=x) and (r=y)

then

exit;

if (l<=x) and (mid>=y)

then

begin

neww(lc);

insert(lc,l,mid,x,y,co);

exit;

end;

if (mid=y)

then

begin

neww(rc);

insert(rc,mid+1,r,x,y,co);

exit;

end;

neww(lc);

neww(rc);

insert(lc,l,mid,x,mid,co);

insert(rc,mid+1,r,mid+1,y,co);

end;

end;

function find(t:pnode;l,r,x,y:longint):longint;

var mid:longint;

begin

if t=nil then exit(0);

with t^ do

begin

mid:=(l+r) div 2;

if (l=x) and (r=y)

then

begin

find:=c;

exit;

end;

if (l<=x) and (mid>=y)

then

begin

find:=find(lc,l,mid,x,y);

exit;

end;

if (mid=y)

then

begin

find:=find(rc,mid+1,r,x,y);

exit;

end;

find:=find(lc,l,mid,x,mid)+find(rc,mid+1,r,mid+1,y);

end;

end;

begin

readln(i,m);

m:=m-1;

while not eof do

begin

read(s);

if s>=3 then break;

if s=1

then

begin

readln(x,y,co);

neww(f[x]);

insert(f[x],0,m,y,y,co);

endelse

begin

readln(x,y,x1,y1);

ans:=0;

for i:=x to x1 do

begin

neww(f[i]);

ans:=ans+find(f[i],0,m,y,y1);

end;

writeln(ans);

end;

end;

end.

線段樹解決偏序問題

1.e buses and people 題意 給定 n 個三元組 a,b,c 現有 m 個詢問,每個詢問給定乙個三元組 a b c 求滿足 a a b b,c c 的最小 c 對應的元組編號。思路 首先肯定離線排序處理,我們按照a排序,那麼它之前的元組肯定都滿足第乙個條件。它之前的元組滿足b b,...

線段樹區間更新(以POJ 3468為例)

在了解單點更新的線段樹的前提下,再繼續理解區間更新的線段樹。區間更新是指更新某個區間內的葉子節點的值,因為涉及到的葉子節點不止乙個,而葉子節點會影響其相應的非葉父節點,那麼回溯需要更新的非葉子節點也會有很多,如果一次性更新完,操作的時間複雜度肯定不是o lgn 為此引入了線段樹中的延遲標記概念,這也...

mark線段樹模板(以維護最值為例)

created by zhengwei.include using namespace std const int maxn 5e4 1 int n 6 int data 原始資料,第乙個數字作廢 線段樹,求區間最值 class segtree param pid 陣列下標,一般從1開始 param...