题意:给出 n 个电视节目,在你附近有一家电视出租商店。它以 X 元 租一台电视机,每一分钟花费是 y元,如果片段 [li,ri] 和 [lj,rj] 相交,则显示i和j不能同时在一台电视上观看。一旦您开始在某台电视上观看一档节目,直到这个节目结束。
你需要花费最小的花费把它全部看完
#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,long long> ii;
const long long mod = 1e9+7;
long long n,x,y,res;
ii A[100000];
multiset<long long,greater<long long>> S;//可重复的set
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>x>>y;
for(int i=0; i<n; ++i) cin>>A[i].first>>A[i].second;
sort(A,A+n,[](ii a,ii b)
{
return a.first<b.first;//起点排序
});
for(int i=0; i<n; ++i)
{
long long tmp=x+y*(A[i].second-A[i].first);//祖一台新电视观看这一段
auto it=S.upper_bound(A[i].first);//第一个大于 A[i].first 的数
if (it!=S.end())
{
if (tmp>y*(A[i].second-*it))
{
tmp=y*(A[i].second-*it);//拼在一起看
S.erase(it);//删去
};
}
S.insert(A[i].second);
res=(res+tmp)%mod;
}
cout << res;
return 0;
}