学习线段树第二天,这道题属于第二简单的线段树,第一简单是单点更新,这个属于区间更新。
区间更新就是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 }