zoukankan      html  css  js  c++  java
  • FZU1608(线段树成段更新,区间求和pushdown延迟标记结构体版)

    题意:给了你一些区间,x,y,第三个参数w是效率,代表这段时间他的单位时间效率,效率总 和就是 (y-x)*w,然后有的时间段会被重复啊,

    比如前面给了1,4,1,后面又给了2,4,3他们为了是的时间段1,4的效率总和最大肯定是选择  2,4区间的效率值选择3,

    意思就是后面出现更好的情况就覆盖前面的,问你总得最大效率和

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <queue>
    #include <cmath>
    #include <map>
    #include <algorithm>
    using namespace std;
    #define M 50005
    #define ls node<<1,l,m
    #define rs node<<1|1,m+1,r
    int n,m,ans;
    struct wq
    {
        int l,r,num;
    };
    wq tree[M<<2];
    void pushdown(int node)
    {
        if(tree[node].num)
        {
            tree[node<<1].num=max(tree[node].num,tree[node<<1].num);
            tree[node<<1|1].num=max(tree[node].num,tree[node<<1|1].num);
            tree[node].num=0;
        }
    }
    void build(int node,int l,int r)
    {
        tree[node].l=l;
        tree[node].r=r;
        tree[node].num=0;
        if(l==r) return ;
        int m=(l+r)>>1;
        build(ls);
        build(rs);
    }
    void update(int node,int l,int r,int add)
    {
        if(tree[node].num>=add) return ;
        if(l<=tree[node].l&&r>=tree[node].r)
        {
            if(tree[node].num<add) tree[node].num=add;
            return ;
        }
        int m=(tree[node].l+tree[node].r)>>1;
        if(r<=m) update(node<<1,l,r,add);
        else if(l>m) update(node<<1|1,l,r,add);
        else
        {
            update(node<<1,l,m,add);
            update(node<<1|1,m+1,r,add);
        }
    }
    void query(int node,int l,int r)
    {
        if(l==r)
        {
            ans+=tree[node].num;
            return ;
        }
        pushdown(node);
        int m=(tree[node].l+tree[node].r)>>1;
        if(r<=m) query(node<<1,l,r);
        else if(l>m) query(node<<1|1,l,r);
        else
        {
            query(node<<1,l,m);
            query(node<<1|1,m+1,r);
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        while(~scanf("%d%d",&n,&m))
        {
            ans=0;
            build(1,1,n);
            int a,b,c;
            while(m--)
            {
                scanf("%d%d%d",&a,&b,&c);
                update(1,a+1,b,c);
            }
            query(1,1,n);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    程序笔记
    2011年11月28日学习重构
    经典到发狂的语录(某男日记摘录)
    每天养成好习惯
    jquery用法
    [读书笔记]软件架构师应该知道的97件事
    Entity Framework 4.2发布,部分更新等待.NET Framework 4.5
    我的阅书记录及相关专业书籍推荐(更新于2017.12)
    [2011 年终项目总结] 第四章、架构设计
    [2011 年终项目总结] 第五章、迭代开发
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/4927417.html
Copyright © 2011-2022 走看看