CodeForces-1061D TV Shows

Posted houraisankaguya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces-1061D TV Shows相关的知识,希望对你有一定的参考价值。

题目链接: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
",ans);
	return 0;
}

  

以上是关于CodeForces-1061D TV Shows的主要内容,如果未能解决你的问题,请参考以下文章

F - Lost Root Shows CodeForces - 1061F(交互+概率)

Codeforces Round #524 (Div. 2)D - TV Shows

Codeforces Round #523 (Div. 2) D. TV Shows

CodeForces-1061B Views Matter

CodeForces1061C Multiplicity

codeforces1061c