题意
有 N N N 个遗迹, M M M 个宝石。当探索到第 i i i 个遗迹,可以获得 l i l_i li 到 r i r_i ri 的所有宝石,加上 s i s_i si 的得分。但当 M M M 个宝石都被探索后,得分将会清零。
思路
考虑贪心,我们只用留下任意一个宝石即可。
其实,我们第 i i i 次只用将区间 [ 1 , l i − 1 ] [1,l_{i}-1] [1,li−1] 的宝石加上 s i s_i si 的得分,和将区间 [ r i + 1 , M ] [r_{i}+1,M] [ri+1,M] 的宝石也加上 s i s_i si 的得分。但是,这样会超时。
所以,我们可以使用差分数组来优化(线段树也可以)。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int cf[100005],QZ;
int ans;
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1,l,r,s;i<=n;i++){
scanf("%lld%lld%lld",&l,&r,&s);
cf[1]+=s,cf[l]-=s,cf[r+1]+=s;//差分
}
for(int i=1;i<=m;i++){
QZ+=cf[i];//第i个宝石保留所获得的得分
ans=max(ans,QZ);//求最大值
}
printf("%lld\n",ans);
return 0;
}