Just a Hook HDU

来源:互联网 发布:如何做免费网络推广 编辑:程序博客网 时间:2024/06/05 18:16

这题属于区间更新的问题,和之前的题目不同的地方是该题是把值改变,而不是加起来,在原来代码的基础上改一改就差不多了

/*If I get TLE , it is good.If I get AC,it's NICE !*/#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>using namespace std;typedef long long ll;const int MAXN=1e5+1000;const int MOD=1e9+7;int n;int newv;struct node{    int l,r,v,c; //c:lazy , v:sum}segtree[4*MAXN];void update(int l,int r,int root){    if(segtree[root].l==l && segtree[root].r==r)    {        segtree[root].v=(r-l+1)*newv;        segtree[root].c=newv;        return ;    }    //如果用到当前区间的子区间,那么就要把父亲的信息传递下去    if(segtree[root].c!=0)    {        segtree[root*2].c=segtree[root*2+1].c=segtree[root].c;        segtree[root*2].v=(segtree[root*2].r-segtree[root*2].l+1)*segtree[root].c;        segtree[root*2+1].v=(segtree[root*2+1].r-segtree[root*2+1].l+1)*segtree[root].c;        segtree[root].c=0;    }    int mid=(segtree[root].l+segtree[root].r)/2;    if(r<=mid) update(l,r,root*2);    else if(l>=mid+1)    update(l,r,root*2+1);    else    {        update(l,mid,root*2);        update(mid+1,r,root*2+1);    }    segtree[root].v=segtree[root*2].v+segtree[root*2+1].v;}void build(int l,int r,int root)//正常建树{    segtree[root].l=l,segtree[root].r=r,segtree[root].v=0,segtree[root].c=0;     //必须要初始化,不初始v=0会导致wawawa    if(l==r)    {        segtree[root].v=1;        return ;    }    int mid=(l+r)/2;    build(l,mid,root*2);    build(mid+1,r,root*2+1);    segtree[root].v=segtree[root*2].v+segtree[root*2+1].v;}int main(void){    int t;    cin >> t;    for(int k=1;k<=t;k++)    {        int n;        scanf("%d",&n);        build(1,n,1);        int q;        scanf("%d",&q);        while(q--)        {            int l,r;            scanf("%d%d%d",&l,&r,&newv);            update(l,r,1);        }        /*for(int i=1;i<=15;i++)            printf("%d-----%d\n",i,segtree[i].v);*/       printf("Case %d: The total value of the hook is %d.\n",k,segtree[1].v);    }}

通过这道题我get了什么?
1.对于区间更新的问题,用一个标记来标记父亲节点所作的操作,那么如果不访问该节点的子节点,就不用往下传递,直接用父亲节点的信息即可,如果要访问该子节点的信息,就要做一个pushdown的操作。加深了lazy对节省时间的巨大作用,这就是线段树能节省时间的巨大原因了,即空间换时间。
2.记得对segtree[root].v初始化为0,否则在pushdown的操作就很蛋疼了…
3.思考不同题目要有个思维建立的过程,很重要,对不同的题思路是不同的

原创粉丝点击