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;
    }
  • 相关阅读:
    .net 面试题 没事多看看。。。。
    分享一下我记忆23种设计模式的方法 <转。。>
    再次写给我们这些浮躁的程序员 《搜集的。。。》
    C#验证邮箱,电话,手机,数字,英文,日期,身份证,邮编,网址,IP类.. (转后整理)
    javascript和jquery使用技巧集
    jQuery 增加 删除 修改select option .
    设计模式(二)
    JavaScript string 字符串类型的扩展方法
    26个jQuery使用技巧
    jBPM开发入门指南(1)
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/4927417.html
Copyright © 2011-2022 走看看