Just a Hook-HDU1698 区间染色+区间查询

Posted ljxdtc666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Just a Hook-HDU1698 区间染色+区间查询相关的知识,希望对你有一定的参考价值。

题意:

hook有一根长度为n的棒,可以将它看成有n段,一开始每段都是铜,hook可以选择一段区间改变棒的属性,

棒有三种属性:铜=1,银=2,金=3,最后输出棒每段的属性总和。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

思路:

区间染色+区间查询

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
typedef long long ll;
int lazy[MAXN<<2],tree[MAXN<<2];
void push_up(int node)
{
    tree[node]=tree[node<<1]+tree[node<<1|1];
}
void build(int node,int l,int r)
{
    if(l==r)
    {
        tree[node]=1;return ;
    }
    int mid=(l+r)>>1;
    build(node<<1,l,mid);
    build(node<<1|1,mid+1,r);
    push_up(node);
}
void push_down(int node,int l,int r,int mid)
{
    lazy[node<<1]=lazy[node];
    lazy[node<<1|1]=lazy[node];
    tree[node<<1]=lazy[node]*(mid-l+1);
    tree[node<<1|1]=lazy[node]*(r-mid);
    lazy[node]=0;
}
void update(int node,int l,int r,int x,int y,int z)
{
    if(x<=l&&y>=r)
    {
        lazy[node]=z;
        tree[node]=(r-l+1)*z;
        return;
    }
    int mid=(l+r)>>1;
    if(lazy[node])push_down(node,l,r,mid);

    if(x<=mid)update(node<<1,l,mid,x,y,z);
    if(y>mid)update(node<<1|1,mid+1,r,x,y,z);
    push_up(node);
}
int query(int node,int l,int r,int x,int y)
{
    if(x<=l&&y>=r)
    {
        return tree[node];
    }
    int ans=0;
    int mid=(l+r)>>1;
    if(lazy[node])push_down(node,l,r,mid);

    if(x<=mid)ans+=query(node<<1,l,mid,x,y);
    if(y>mid)ans+=query(node<<1|1,mid+1,r,x,y);
    return ans;
}
int main()
{
    int t;scanf("%d",&t);int case_=0;
    while(t--)
    {
        memset(lazy,0,sizeof(lazy));
        int n;scanf("%d",&n);
        int q;scanf("%d",&q);
        build(1,1,n);
        while(q--)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            update(1,1,n,x,y,z);
        }
        printf("Case %d: The total value of the hook is %d.
",++case_,query(1,1,n,1,n));
    }
    return 0;
}

以上是关于Just a Hook-HDU1698 区间染色+区间查询的主要内容,如果未能解决你的问题,请参考以下文章

Just a Hook HDU - 1698 (区间修改+区间查询)

hdu 1698 Just a Hook(线段树区间修改)

HDU 1698 Just a Hook 线段树 区间更新

HDU - 1698 Just a Hook(线段树区间整体修改值,查询区间和)

1698-Just a Hook 线段树(区间替换)

HDU 1698 Just a Hook 线段树区间更新