Codeforces Round #523 (Div. 2) D - TV Shows ( multiset的使用)

题意:给出 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41668093/article/details/84640972