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\n",ans);
    }
    return 0;
}

 

posted on 2015-11-01 11:39  恶devil魔  阅读(434)  评论(0编辑  收藏  举报

导航