題目大意
在乙個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...