hdu 4902 线段树双标记类型题

比赛时没敲出来,似乎现在敲得还是不好

后来找了份题解,http://www.cnblogs.com/qq1012662902/p/3883614.html  600多msAC  很高效了


参考了之后写了代码  近期在重写一遍

#include 
#include 
#include 
#include 
#include 
using namespace std;


#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define rep(i,s,e) for(int i=s;imid)
            update(rs(rt),l,r,op,v);
        else
        {
            update(ls(rt),l,mid,op,v);
            update(rs(rt),mid+1,r,op,v);
        }
    }
    pushup(rt);
}


void dfs(int rt)
{
    if(nodes[rt].l==nodes[rt].r)
    {
        num[nodes[rt].l]=nodes[rt].val;
        return;
    }
    if(nodes[rt].val!=-1)
    {
        nodes[ls(rt)].val=nodes[rs(rt)].val=nodes[rt].val;
        nodes[rt].val=-1;
    }
    dfs(ls(rt));
    dfs(rs(rt));
}


int main()
{
    //IN("hdu4902.txt");
    int ncase,n,q,l,v,r;
    int op;
    scanf("%d",&ncase);
    while(ncase--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]);
        build(1,1,n);
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d%d%d%d",&op,&l,&r,&v);
            update(1,l,r,op,v);
        }
        dfs(1);
        for(int i=1;i<=n;i++)
            printf("%d ",num[i]);
        putchar('\n');
    }
    return 0;
}



你可能感兴趣的:(数据结构----线段树)