• hdu 1698 Just a Hook


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

    题目大意:给你三种硬币。分别面值为1,2,3。初始时,面值都为1,后面没更改一次,就把这个区间的银币换位面值为 X的硬币。最后求全部的硬币面值是多少。

    直接贴代码啦

    code:

    #include<stdio.h>
    #include<iostream>
    #define L(u) (u<<1)
    #define R(u) (u<<1|1)
    
    const int M=100010;
    
    struct Node
    {
        int l,r;
        int add,sum;
    }node[M*4];
    
    //int a[M];
    
    void pushup(int u)
    {
        node[u].sum=node[L(u)].sum+node[R(u)].sum;
        return ;
    }
    
    void pushdown(int u)
    {
        node[L(u)].add=node[u].add;
        node[L(u)].sum=(node[L(u)].r-node[L(u)].l+1)*node[u].add;
        node[R(u)].add=node[u].add;
        node[R(u)].sum=(node[R(u)].r-node[R(u)].l+1)*node[u].add;
        node[u].add=0;
    }
    
    void build(int i,int left,int right)
    {
        node[i].l=left;
        node[i].r=right;
        node[i].add=0;
        if(node[i].l==node[i].r)
        {
            node[i].sum=1;
            return;
        }
        int mid=(node[i].l+node[i].r)/2;
        build(L(i),left,mid);
        build(R(i),mid+1,right);
        pushup(i);
    }
    
    void update(int u,int left,int right,int val)
    {
        if(left<=node[u].l&&node[u].r<=right)
        {
            node[u].add=val;                                        
            node[u].sum=(node[u].r-node[u].l+1)*val;       //注意之处。这个区间的值是这么计算的
            return ;
        }
        //node[u].sum=(right-left+1)*val;
        if(node[u].add) pushdown(u);
        int mid=(node[u].l+node[u].r)/2;
        if(right<=mid) update(L(u),left,right,val);
        else if(left>mid) update(R(u),left,right,val);
        else
        {
            update(L(u),left,mid,val);
            update(R(u),mid+1,right,val);
        }
        node[u].sum=node[L(u)].sum+node[R(u)].sum;
    }
    
    int query(int u,int left,int right)
    {
         if(left<=node[u].l&&node[u].r<=right)
        {
            return node[u].sum;
        }
        if(node[u].add) pushdown(u);
        int mid=(node[u].l+node[u].r)/2;
         if(right<=mid) return query(L(u),left,right);
        else if(left>mid) return query(R(u),left,right);
        else return (query(L(u),left,mid)+query(R(u),mid+1,right));
    }
    
    int main()
    {
        int T,n,m,i,x,y,z;
        int k=0;
        scanf("%d",&T);
        while(T--)
        {
            k++;
             scanf("%d%d",&n,&m);
             build(1,1,n);
             for(i=0;i<m;i++)
             {
                 scanf("%d%d%d",&x,&y,&z);
                 update(1,x,y,z);
             }
             printf("Case %d: The total value of the hook is %d.
    ",k,query(1,1,n));
        }
        return 0;
    }



  • 相关阅读:
    JQuery+ajax数据加载..........
    JQuery文本框验证
    将SqlDataReader 数据集转化为datatbale ,在将datatable 转化为iList
    DataSet转化为DataTable
    Case 降序升序排列
    Sql case
    sql STUFF 分组
    全/反选
    【面试题034】丑数
    【面试题033】把数组排成最小的数
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6829998.html
Copyright © 2020-2023  润新知