模板 线段树(部分功能)

Posted new-ljx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 线段树(部分功能)相关的知识,希望对你有一定的参考价值。

嗯...

这个模板里有线段树的建树、标记下放、单点查询、单点加、区间和、单点更改。

 

代码:

技术图片
 1 struct Tree
 2     int l,r,f = 0;
 3     long long wi;
 4 tree[Maxn*3];
 5 
 6 void build(int le,int ri,int k)
 7     tree[k].l = le;
 8     tree[k].r = ri;
 9     if(le == ri)
10         scanf("%lld",&tree[k].wi);
11         return;
12     
13     int m = (le + ri)/2;
14     build(le,m,k*2);
15     build(m+1,ri,k*2+1);
16     tree[k].wi = tree[k*2].wi + tree[k*2+1].wi;
17 //建树 
18 
19 void down(int k)
20     tree[k*2].f += tree[k].f;
21     tree[k*2+1].f += tree[k].f;
22     tree[k*2].wi += tree[k].f*(tree[k*2].r + 1 - tree[k*2].l);
23     tree[k*2+1].wi += tree[k].f*(tree[k*2+1].r + 1 - tree[k*2+1].l);
24     tree[k].f = 0;
25 //标记下放 
26 
27 void ask(int k)
28     if(tree[k].l == tree[k].r)
29         ans = tree[k].wi;
30         return;
31     
32     if(tree[k].f)down(k);
33     int m = (tree[k].l + tree[k].r)/2;
34     if(x <= m)ask(k*2);
35     else ask(k*2+1);
36 //单点查询 
37 
38 void add(int k)
39     if(tree[k].l == tree[k].r)
40         tree[k].wi += y;
41         return;
42     
43     if(tree[k].f)down(k);
44     int m = (tree[k].l + tree[k].r)/2;
45     if(x <= m)add(k*2);
46     else add(k*2+1);
47     tree[k].wi = tree[k*2].wi + tree[k*2+1].wi;
48 //单点加 
49 
50 void sum(int k)
51     if(x <= tree[k].l && tree[k].r <= y)
52         ans += tree[k].wi;
53         return;
54     
55     if(tree[k].f)down(k);
56     int m = (tree[k].l+tree[k].r)/2;
57     if(x <= m)sum(k*2);
58     if(y > m)sum(k*2+1);
59 //区间和 
60 
61 void change(int k)
62     if(x <= tree[k].l && tree[k].r <= y)
63         tree[k].f+=z;
64         tree[k].wi += z*(tree[k].r + 1 - tree[k].l);
65         return;
66     
67     if(tree[k].f)down(k);
68     int m = (tree[k].l + tree[k].r)/2;
69     if(x <= m)change(k*2);
70     if(m < y)change(k*2+1);
71     tree[k].wi = tree[k*2].wi + tree[k*2+1].wi;
72 //单点修改 
模板

 

以上是关于模板 线段树(部分功能)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P3402 模板可持久化并查集(可持久化线段树,线段树)

可持久化线段树(主席树)

线段树总结

LUOGU P3834 模板可持久化线段树 1(主席树)

线段树P3372模板-线段树

模板-线段树