线段树--区间更新-区间查询HDU 1698

来源:互联网 发布:现场网络直播的含义 编辑:程序博客网 时间:2024/04/26 16:10

题意: 给钩子的价值更新,给出区间,查找区间价值

思路:加lazy标记,不必更新到每个子节点 

#include <stdio.h>#include <math.h>#include <iostream>#include <algorithm>#define lson i<<1,left,mid#define rson i<<1|1,mid+1,rightusing namespace std;struct TreeNode{    int lazy,val,left,right,tag;} Tree[400005];void Build(int i , int left , int right ){    Tree[i].lazy=0;    Tree[i].left=left;    Tree[i].right=right;    Tree[i].tag=0;    if(left==right)    {        Tree[i].val=1;        return ;    }    int mid=(left+right)>>1;    Build(lson);    Build(rson);    Tree[i].val=Tree[i<<1].val+Tree[i<<1|1].val;}void update(int i,int left, int right , int w){    if(Tree[i].left==left && Tree[i].right ==right )    {        Tree[i].tag=w;        Tree[i].lazy=1;        Tree[i].val=w*(right - left +1);        return ;    }    int mid=(Tree[i].left+Tree[i].right)>>1;    if(Tree[i].lazy==1)    {        Tree[i].lazy=0;        update( i<<1,Tree[i].left,mid,Tree[i].tag);        update(i<<1|1,mid+1,Tree[i].right,Tree[i].tag);        Tree[i].tag=0;    }    if(right<=mid)    {        update(i<<1,left,right,w);    }    else if(left>mid)    {        update(i<<1|1,left,right,w);    }    else    {        update(lson,w);        update(rson,w);    }    Tree[i].val=Tree[i<<1].val+Tree[i<<1|1].val;}int main(){    int x,y,z;    int n;    int m;    int T;    scanf("%d",&T);    int iCase=0;    while(T--)    {        iCase++;        scanf("%d%d",&n,&m);        Build(1,1,n);        while(m--)        {            scanf("%d%d%d",&x,&y,&z);            update(1,x,y,z);         }        printf("Case %d: The total value of the hook is %d.\n",iCase,Tree[1].val);    }    return 0;}

0 0