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