码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces-1061D TV Shows

时间:2019-11-24 15:57:02      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:insert   force   第一个   tor   ref   out   define   bsp   mes   

题目链接:http://codeforces.com/problemset/problem/1061/D

 

题解:将所有节目以l为第一关键字,r为第二关键字从小到大排序,再准备一个存储节目r值的multiset。则对于某个电视节目i来说,看这个电视节目所花的最小代价是min[x+(ri-li)*y,(ri-f)*y],f代表multiset中第一个小于li的元素,更新答案后将新的r放入multiset中即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
struct Show
{
	ll l,r;
	bool operator <(const Show &a)const{
		if(l==a.l) return r<a.r;
		return l<a.l;
	}
}show[100005];
multiset<ll>s;
int main()
{
	int n;
	ll x,y,ans=0;
	scanf("%d%lld%lld",&n,&x,&y);
	for(int i=1;i<=n;i++) scanf("%lld%lld",&show[i].l,&show[i].r);
	sort(show+1,show+1+n);
	for(int i=1;i<=n;i++){
        multiset<ll>::iterator iter;
		iter=s.lower_bound(show[i].l);
		if(iter==s.begin()){
			s.insert(show[i].r);
			ans+=x+y*(show[i].r-show[i].l);
			ans%=mod;
			continue;
		}
		iter--;
		ll f=(*iter);
		if((show[i].r-f)*y>x+y*(show[i].r-show[i].l)){
			s.insert(show[i].r);
			ans+=x+y*(show[i].r-show[i].l);
			ans%=mod;
		}
		else{
			s.erase(iter);
			s.insert(show[i].r);
			ans+=(show[i].r-f)*y;
			ans%=mod;
		}
	}
	printf("%lld\n",ans);
	return 0;
}

  

CodeForces-1061D TV Shows

标签:insert   force   第一个   tor   ref   out   define   bsp   mes   

原文地址:https://www.cnblogs.com/HouraisanKaguya/p/11922424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!