题目链接:https://ac.nowcoder.com/acm/contest/3566/D
题目大意:
给定一个n元素数组,你有m个操作,每次操作可以选择一个区间[li,ri],将这个区间内的数减少vi,你可以选择其中一些进行操作,问你最后可以得到的最大值与最小值的差是多少?
思路:
因为每个操作是对于区间而言,我们不可能去遍历每个区间,所以需要更好的策略。
又因为题中说的是最大值与最小值的差,所以我们可以考虑固定一端,选择另一端。
于是,我们枚举每个位置i,然后选择操作,让i尽可能的小(也就是如果区间x包括了点i,我们就选择区间x),这样点i能够到达理想的最小值,此时我们再查询整个区间的最大值,就是一种可行的答案了,最后答案取所以位置的最大值就完了。
因为一个点可能被很多个区间覆盖,我们并不是暴力加,在从左往右遍历的过程中,在每个区间的左端点l插入这个区间,在区间的右端点r+1处删除这个区间,这样每个区间只会被update两次,就能更新到每个位置i啦。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
struct TreeNode{
int l,r;
ll maxx;
ll minn;