【原创】hdu1698 Just a Hook(线段树→区间更新,区间查询)

学习线段树第二天,这道题属于第二简单的线段树,第一简单是单点更新,这个属于区间更新。

区间更新就是lazy思想,我来按照自己浅薄的理解谈谈lazy思想:

  就是在数据结构中,树形结构可以线性存储(线性表)也可以树状存储(链表)

树形
typedef struct node { int data; struct node* Lchild; struct node* Rchild; }Btree,*BTree;
BTree = (BTree)malloc(Btree);
好像是这样吧...大半个暑假过去忘得一干二净...这个并不重要....

然后顺序就是存到顺序表了,第i个节点的左孩子节点就是i*2,右孩子节点就是i*2+1,这个是一个性质。

这个题就是用了树结构的顺序表。

好像也没啥说的,简单的模板题,看代码吧:

 1 #include<cstdio>
 2 #define N 100003
 3 using namespace std;
 4 struct nod
 5 {
 6     int data,l,r,lazy;
 7 }tree[4*N];
 8 
 9 void push_up(int i)
10 {
11     tree[i].data = tree[i*2].data+tree[i*2+1].data;
12 }
13 
14 void build_tree(int i,int l,int r)
15 {
16     tree[i].l = l;
17     tree[i].r = r;
18     tree[i].lazy = -1;
19     if(l==r){
20         tree[i].data = 1;
21         return;
22     }
23     int mid = (r + l)/2;
24     build_tree(i*2,l,mid);
25     build_tree(i*2+1,mid+1,r);
26     push_up(i);
27 }
28 
29 void push_down(int i)
30 {
31     tree[i*2].data = tree[i].lazy*(tree[i*2].r-tree[i*2].l+1);
32     tree[i*2+1].lazy = tree[i*2].lazy = tree[i].lazy;
33     tree[i*2+1].data = tree[i].lazy*(tree[i*2+1].r-tree[i*2+1].l+1);
34     tree[i].lazy = -1;
35 }
36 
37 void updata(int i,int v,int l,int r)
38 {
39     if(l<=tree[i].l&&tree[i].r<=r)
40     {
41         tree[i].data = (tree[i].r-tree[i].l+1)*v;
42         tree[i].lazy = v;
43         return;
44     }
45     if(tree[i].lazy!=-1) push_down(i);
46     int mid = (tree[i].l+tree[i].r)/2;
47     if(l<=mid)
48         updata(i*2,v,l,r);
49     if(r > mid)
50         updata(i*2+1,v,l,r);
51     push_up(i);
52 }
53 
54 int query(int i,int l,int r)
55 {
56     if(l<=tree[i].l&&tree[i].r<=r)
57     {
58         return tree[i].data;
59     }
60     if(tree[i].lazy!=-1)
61         push_down(i);
62     int mid=(tree[i].l+tree[i].r)/2;
63     if(r<=mid)
64         return query(i*2,l,r);
65     if(l>=mid+1)
66         return query(i*2+1,l,r);
67     return query(i*2,l,r)+query(i*2+1,l,r);
68 }
69 
70 int main()
71 {
72     int noc,ug;
73     scanf("%d",&noc);
74     ug = noc;
75     while(noc--)
76     {
77         int n,q,x,y,z;
78         scanf("%d",&n);
79         build_tree(1,1,n);
80         scanf("%d",&q);
81         for(int i=1;i<=q;i++)
82         {
83             scanf("%d%d%d",&x,&y,&z);
84             updata(1,z,x,y);
85         }
86         printf("Case %d: The total value of the hook is %d.
",ug-noc,tree[1].data);
87     }
88 }
原文地址:https://www.cnblogs.com/liwenchi/p/5762608.html