1、
(1)、lazy思想:對整個結點進行的操作,先在結點上做標記,而並非真正執行,直到根據查詢操作的需要分到下層。
(2)、延遲標記 lazy:如果需要對乙個區間中每乙個葉結點進行操作,我們不妨先別忙著操作,而是在所有大區間上做乙個標記, 下一次遇到或要用到時,再進行處理(標記傳遞),達到減少操作次數,提高線段樹的效率的作用。
2、
nkoj 2297 數列操作2
時間限制 : 10000 ms 空間限制 : 165536 kb
問題描述
給出一列數(1≤i≤n),總共有m次操作,操作分如下兩種:
1.add x y z 將x到y區間的所有數字加上z
2.ask x y 將x到y區間的最大乙個數字輸出
輸入格式
第一行,乙個整數n
第二行,n個空格間隔的整數,表示數列一開始的情形
第三行,乙個整數m
接下來m行,表示m條操作
樣例輸入
5 1 2 3 2 5
5 add 1 4 3
ask 2 3
ask 3 5
add 2 4 2
ask 2 5
樣例輸出
6 6
8提示
m,n<=100000
x,y<=100000
z<=1000
思路
lazy
**:
#include
#include
using
namespace
std;
const
int need=200003;//資料有鬼
struct fyt[need*4];
int a[need];
int x,y,z;
void build(int s,int x,int y)
build(s<<1,x,(x+y)/2),build((s<<1)|1,(x+y)/2+1,y);
t[s].val=max(t[s<<1].val,t[(s<<1)|1].val);
}void putdown(int s)
void add(int s)
if(!(y1].a||x>t[s<<1].b)) add(s<<1);
if(!(y1)|1].a||x>t[(s<<1)|1].b)) add((s<<1)|1);
t[s].val=max(t[s<<1].val,t[(s<<1)|1].val);
}int getmax(int s)
int main()
else
}}
2、
nkoj 2295 塗色
時間限制 : 10000 ms 空間限制 : 165536 kb
問題描述輸入格式
第一行,乙個整數n,表示總的運算元
以後n行輸入三個整數(n<=100000)。
第乙個數為1表示塗色,0表示擦去。
第二、三個數表示線段a,b。
輸出格式
有多少條單位線段[k,k+1]被塗上了顏色。
輸入樣例1:
5 1 1 15
0 4 9
1 7 18
1 7 9
0 1 3
輸入樣例2:
4 1 1 8
0 4 8
1 7 8
0 1 3
輸出樣例1:
12輸出樣例2:
2思路
1、因為題所求為線段數量,而以點為葉節點不好討論,所以葉節點表示乙個單位線段,即[x,mid]、[mid,y]分別為左兒子和右兒子表示的區間。
注意a+1==b時才表示為葉節點。
2、lazy不僅儲存要下放的狀態還表示該區間的狀態。
因為狀態較少,且子節點和父節點狀態很可能一致,所以才這樣處理。
**:
#include#includeusing namespace std;
const
int need=200013;
struct fyt[need*2]; //-1 clean 1 paint 0 表示該區間中既有塗了顏色的也有沒塗的
int c[need>>1],le[need*2],ri[need*2];
int tot=0,x,y;
void build(int x,int y)
le[s]=tot+1;build(x,(x+y)>>1);
ri[s]=tot+1;build((x+y)>>1,y);
}void putdown(int s)
void clean(int s)
//如果「putdown」中沒判斷是否為葉節點,這裡就要先判斷。
if(t[s].lazy>0) putdown(s);
if(!(t[le[s]].a>y||t[le[s]].bif(!(t[ri[s]].a>y||t[ri[s]].bvoid paint(int s)
if(t[s].lazy
<0) putdown(s);
if(!(t[le[s]].a>y||t[le[s]].bif(!(t[ri[s]].a>y||t[ri[s]].bint solve(int s)
int main()
printf("%d",solve(1));
}
相似題:
(lazy 相似)
3、
例題 線段數 lazy
1 nkoj 1887 noip2012 day2 借教室 時間限制 40000 ms 空間限制 128000 kb 問題描述 在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要 向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教...
線段樹 lazy標記
每個節點代表區間 唯一根節點,也就是全部區間 葉節點是長度為1的子區間,也就是所代表陣列上的乙個點 const int maxn 1e3 struct segmenttree e 4 maxn 建樹 void build int p,int l,int r int mid l r 2 build p...
例題 線段樹
1 注意討論不能建樹的情況 nkoj 1321 數列操作問題 時間限制 10000 ms 空間限制 165536 kb 問題描述 假設有一列數 1 i n 支援如下兩種操作 將ak的值加d。k,d是輸入的數 輸出as as 1 at。s,t都是輸入的數,s t 輸入格式 第一行乙個整數n,第二行為n...