線段樹在n較小、操作較多的情況下效率很高。雖然如此,如果直接暴力進行修改的話還是會tle得很慘。於是乙個叫做懶標記的東西應運而生。
懶標記
why優秀:在修改乙個節點時,若此點已經被懶標記所標記,我們就將此點懶標記取消,標記左右子節點傳遞下去,當被更新或者被查詢時再更新節點,節約了根本不會被用到的花費。這也是線段樹作為「樹」優秀的地方。
開始學習
洛谷已經為我們排好了對線段樹的逐層深度學習xd
1 #include2 #include3using
namespace
std;
4const
int maxn=1e5,maxm=1e5;
5 typedef long
long
ll;6
void read(int &x)714
}15int a[maxn*10
];16
struct
nodee[maxn*6
];19
intn,m,k;
20 inline ll ls(ll ro)
21 inline ll rs(ll ro)
22 inline void
push_up(ll ro)
2326 inline void
push_down(ll ro)
2734
35void
build(ll ro,ll l,ll r)
3643 e[ro].tag=0
;44 ll mid=(l+r)>>1;45
build(ls(ro),l,mid);
46 build(rs(ro),mid+1
,r);
47push_up(ro);48}
4950
void
update(ll ro,ll l,ll r)
5158
push_down(ro);
59 ll mid=(e[ro].l+e[ro].r)>>1;60
if(l<=mid)update(ls(ro),l,r);
61if(r>mid)update(rs(ro),l,r);
62push_up(ro); 63}
6465
ll check(ll ro,ll l,ll r)
6675
signed main()
7692
case(2
):97}98
}99return0;
100 }
1 #include2 #include3using
namespace
std;
4const
int maxn=1e5;
5 typedef long
long
ll;6
intn,m,p,a[maxn],k;
7struct
treee[maxn*4
];10 inline void read(int &x)
11 //
這個快讀讀不了負數 xd
17 inline ll ls(int ro)
18 inline ll rs(int ro)
1920 inline void
lazy_add(ll ro)
2126
27 inline void
lazy_tag(ll ro)
2833
34 inline void
push_down(ll ro)
3543
44 inline void
push_up(ll ro)
4548
49void
build(ll ro,ll l ,ll r)
50//
賦值 54
int mid=(l+r)>>1;55
build(ls(ro),l,mid);
56 build(rs(ro),mid+1
,r);
57push_up(ro);
58 e[ro].val%=p;//
膜一下 59}
6061
//更新乘
62void
update_tag(ll ro,ll l ,ll r)
6371
push_down(ro);
72int mid=(e[ro].l+e[ro].r)>>1;73
if(l<=mid)update_tag(ls(ro),l,r);
74if(r>mid)update_tag(rs(ro),l,r);
75push_up(ro);76}
7778
//更新和
79void
update_add(ll ro,ll l,ll r)
8087
push_down(ro);
88int mid=(e[ro].l+e[ro].r)>>1;89
if(l<=mid)update_add(ls(ro),l,r);
90if(r>mid)update_add(rs(ro),l,r);
91push_up(ro);92}
9394
ll query(ll ro,ll l,ll r)
95105
intmain()
106121
case(2
):126
case(3
):131
}132
}133
return0;
134 }
我不會xd
有待更新
(其實和2一樣就是複雜一點)
poj 3468 線段樹 懶標記
簡單的線段樹區間求和問題,每次改變區間值得時候採用懶標記的操作,等到下次經過這個區間的時候再將懶標記向下傳遞。include include using namespace std int n,q int a 100005 long long sum 500005 lazy 500005 void ...
線段樹懶標記好題 HDU4578
1 1 x y c 代表 把區間 x,y 上的值全部加c 2 2 x y c 代表 把區間 x,y 上的值全部乘以c 3 3 x y c 代表 把區間 x,y 上的值全部賦值為c 4 4 x y p 代表 求區間 x,y 上值的p次方和1 p 3 維護sum1,sum2,sum3分別為一次方 二次方...
字首查詢(字典樹 線段樹懶惰標記)
描述 在乙個 minecraft 村莊中,村長有這一本小寫字母構成的名冊 字串的表 每個名字旁邊都記錄著這位村民的聲望值,而且有的村民還和別人同名。隨著時間的推移,因為沒有村民死亡,這個名冊變得十分大。現在需要您來幫忙維護這個名冊,支援下列 4 種操作 1.插入新人名 si,聲望為 ai 2.給定名...