码迷,mamicode.com
首页 > 其他好文 > 详细

hdu(1698)——Just a Hook(成段更新,节点求和,lazy思想)

时间:2015-06-14 11:02:52      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

题目的大意是:

一开始有n个钩子,然后他们的价值全是1。

然后有Q次操作,然后每次有三个数x,y,z;你可以改变从x到y的区间的钩子的值为z。

然后最后一个询问,要你输出n个钩子的总价值是多少。

这里我首次接触到了lazy思想,实际上就是给完全包含当前区间的那个区间标记一下,然后不继续往下面更新,直到下次继续遇到这个区间并且需要继续往下面更新才把当前的lazy标记往下去更新。并且也不要忘记pushup更新操作。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn  111111
int a[maxn];
struct node{
    int l,r;
    int x;
    int add,flag;
}tree[maxn*4];
int ans=0;
void pushup(int v){
    int temp=v<<1;
    tree[v].x=tree[temp].x+tree[temp+1].x;
}
void pushdown(int v,int x){
    int temp=v<<1;
    tree[temp].x=x*(tree[temp].r-tree[temp].l+1);
    tree[temp+1].x=x*(tree[temp+1].r-tree[temp+1].l+1);
    tree[v].add=0;
}
void build(int l,int r,int v){
    tree[v].l=l;
    tree[v].r=r;
    tree[v].x=1;
    tree[v].add=0;
    tree[v].flag=0;
    if(l==r) return;
    int mid=(tree[v].l+tree[v].r)>>1;
    int temp=v<<1;
    build(l,mid,temp);
    build(mid+1,r,temp+1);
    pushup(v);
}
void update(int l,int r,int v,int x){
    if(l==tree[v].l&&r==tree[v].r){
        tree[v].x=x*(r-l+1);
        tree[v].flag=1;
        tree[v].add=x;
        return;
    }
    int mid=(tree[v].l+tree[v].r)>>1;
    int temp=v<<1;
    if(tree[v].flag==1){
        tree[v].flag=0;
        update(tree[v].l,mid,temp,tree[v].add);
        update(mid+1,tree[v].r,temp+1,tree[v].add);
        tree[v].add=0;
    }
    if(r<=mid) update(l,r,temp,x);
    else if(l>mid) update(l,r,temp+1,x);
    else{
        update(l,mid,temp,x);
        update(mid+1,r,temp+1,x);
    }
    pushup(v);
}
int main(){
    int T,n,x,y,z,Q;
    while(~scanf("%d",&T)){
        int j=1;
        while(T--){
            memset(a,0,sizeof(a));
            scanf("%d",&n);
            build(0,n-1,1);
            #if 1
            scanf("%d",&Q);
            while(Q--){
                scanf("%d%d%d",&x,&y,&z);
                x--; y--;
                update(x,y,1,z);
            }
            ans=tree[1].x;
            printf("Case %d: The total value of the hook is %d.\n",j++,ans);
            #endif
        }
    }
}


hdu(1698)——Just a Hook(成段更新,节点求和,lazy思想)

标签:

原文地址:http://blog.csdn.net/acmer_hades/article/details/46489391

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!