hdu-1698-Just a Hook-线段树-区域更新,区域查询

来源:互联网 发布:路由器对网络稳定性 编辑:程序博客网 时间:2024/06/02 07:30

flag[i]:标记i这个区间的值。

val[i]:i这个区间的长度

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>using namespace std;#define INF 99999999#define lmin 1#define rmax n#define lson l,(l+r)/2,rt<<1#define rson (l+r)/2+1,r,rt<<1|1#define root lmin,rmax,1#define maxn 110000int flag[maxn*4];int val[maxn*4];void push_up(int rt){    if(flag[rt<<1]==flag[rt<<1|1])        flag[rt]=flag[rt<<1];}void push_down(int rt){    if(flag[rt])    {        flag[rt<<1]=flag[rt<<1|1]=flag[rt];        flag[rt]=0;    }}void creat(int l,int r,int rt){    flag[rt]=1;    val[rt]=r-l+1;    if(l!=r)    {        creat(lson);        creat(rson);    }}void update(int ll,int rr,int x,int l,int r,int rt){    if(rr<l||ll>r)return;    if(ll<=l&&rr>=r)    {        flag[rt]=x;        return;    }    push_down(rt);    update(ll,rr,x,lson);    update(ll,rr,x,rson);    push_up(rt);}int query(int ll,int rr,int l,int r,int rt){    if(rr<l||ll>r)return 0;    if(ll<=l&&rr>=r&&flag[rt])    {        return flag[rt]*val[rt];    }    return query(ll,rr,lson)+query(ll,rr,rson);}int main(){    int T,cas,n,l,r,x,q;    scanf("%d",&T);    cas=0;    while(T--)    {        cas++;        scanf("%d",&n);        creat(root);        scanf("%d",&q);        while(q--)        {            scanf("%d%d%d",&l,&r,&x);            update(l,r,x,root);        }        printf("Case %d: The total value of the hook is %d.\n",cas,query(1,n,root));    }    return 0;}


0 0