标签: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