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; }