题目链接:
https://cn.vjudge.net/problem/FZU-1608
题目大意:
长度n,m次操作;每次操作都有三个数:a,b,c;意味着(a,b]区间单位长度的价值为c,若某段长度不曾被操作,则意味着该长度价值为0,若有一段长度有多个价值,则选取最大的。(多组输入)请输出(0,n]内最大价值和。
解题思路:
直接进行懒惰标记更新即可。
然后再直接处理出每个数字最大值即可。也就是不断pushdown懒惰标记直到每个叶子节点,这样叶子节点的懒惰标记一定是最大值。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
#define Max(a, b) (a) > (b) ? (a) : (b)
#define Min(a, b) (a) < (b) ? (a) : (b)
#define Mem(a) memset(a, 0, sizeof(a))
#define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
#pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} typedef long long ll;
const int maxn = + ;
const int MOD = ;//const引用更快,宏定义也更快
#define MID(l, r) ((l) + ((r) - (l)) / 2)
#define lson(o) ((o)<<1)
#define rson(o) ((o)<<1|1)
struct node
{
int l, r, lazy, sum;
}tree[maxn * ];
void pushup(int o)
{
tree[o].sum = tree[lson(o)].sum + tree[rson(o)].sum;
}
void pushdown(int o)
{
if(tree[o].lazy > )
{
int lc = lson(o), rc = rson(o);
tree[lc].lazy = Max(tree[lc].lazy, tree[o].lazy);
tree[rc].lazy = Max(tree[rc].lazy, tree[o].lazy);
}
}
void build(int o, int l, int r)
{
tree[o].l = l;
tree[o].r = r;
if(l == r)
{
tree[o].lazy = tree[o].sum = ;
return;
}
int m = MID(l, r);
build(lson(o), l, m);
build(rson(o), m + , r);
pushup(o);
}
int ql, qr;
int v;
void update(int o)//懒惰标记
{
//cout<<o<<" "<<tree[o].l<<" "<<tree[o].r<<" "<<ql<<" "<<qr<<endl;
if(ql <= tree[o].l && qr >= tree[o].r)tree[o].lazy = Max(tree[o].lazy, v);
else
{
int m = MID(tree[o].l, tree[o].r);
if(ql <= m)update(lson(o));
if(qr > m)update(rson(o));
}
}
void query(int o)
{
if(tree[o].l == tree[o].r)//如果是叶子节点,那就计算sum值
{
tree[o].sum = Max(tree[o].sum, tree[o].lazy);
return;
}
pushdown(o);//不是叶子节点,那就把懒惰标记传递下去
query(lson(o));
query(rson(o));
pushup(o);//计算总和。
}
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
Mem(tree);
build(, , n);
while(m--)
{
ql = read(), qr = read(), v = read();
ql++;
update();
}
query();
printf("%d\n", tree[].sum);
}
return ;
}