zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    进程管理 2
    进程管理 1
    Linux进程
    分配swap分区
    磁盘分区与挂载
    文件系统常用命令
    多线程
    系统hosts文件的作用
    sql 连接查询的区别 inner,left,right,full
    sql 游标
  • 原文地址:https://www.cnblogs.com/ljxdtc666/p/12222904.html
Copyright © 2011-2022 走看看