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;
    }
  • 相关阅读:
    linux 查看数据库和表
    使用Java实现发送email邮件
    kafka使用说明书
    关于hadoop各种项目中用到的maven依赖
    阿里云服务器快速搭建自己的个人网站
    CentOS7命令大全
    solr中文分词
    windows安装MySQL详细图解过程
    spark数据倾斜分析与解决方案
    浅谈KMlib(机器学习)
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/4927417.html
Copyright © 2011-2022 走看看