标签: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; }
标签:insert force 第一个 tor ref out define bsp mes
原文地址:https://www.cnblogs.com/HouraisanKaguya/p/11922424.html