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

【codeforces】【Round#523D】TV shows

时间:2018-11-25 11:42:46      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:++   pre   erase   event   cli   bsp   tor   hide   \n   

题意:n个节目,每个节目的播放时间为[li,ri],你需要选择一些电视机全部播放这些节目,一台电视机不能同时播放多个节目,选择一个新的电视机代价为x , 如果某台电视机的使用时间为[Li,Ri]需要付出(Ri-Li)*y的代价,问最小的代价;

题解:
        答案是选由于使用电视播放节目的代价是固定的,所以只需要让浪费的使用时间和选择一个新的电视的代价之和最小即可,左端点排序,对于[li,ri],每次选择前面使得rj<li的rj最大的(lj,rj),将x和(li-rj)*y比较讨论;

        cf的题解里面写了证明,但是我总感觉不太严谨的样子。。。。。

        具体实现用mulset;

 

技术分享图片
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<set>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=100010 ,mod=1e9+7;
 7 int n,ans,x,y;
 8 struct node{
 9     int x,y;
10     bool operator <(const node&A)const{
11         return x == A.x ? y < A.y : x < A.x;
12     }
13 }a[N];
14 multiset<int>s;
15 multiset<int>::iterator it;
16 int main(){
17 //    freopen("D.in","r",stdin);
18 //    freopen("D.out","w",stdout);
19     scanf("%d%d%d",&n,&x,&y);
20     for(int i=1;i<=n;i++){
21         scanf("%d%d",&a[i].x,&a[i].y);
22         ans = (ans + 1ll * y * (a[i].y - a[i].x) %mod)%mod;
23     }
24     sort(a+1,a+n+1);
25     for(int i=1;i<=n;i++){
26         it = s.lower_bound(a[i].x);
27         if(it==s.begin() || 1ll*(a[i].x-*(--it)) * y >= x){
28             ans=(ans+x)%mod;
29             s.insert(a[i].y);
30         }else{
31             ans=(ans+1ll*(a[i].x-*it) * y%mod)%mod;
32             s.erase(it);
33             s.insert(a[i].y);
34         }
35     }
36     printf("%d\n",ans);
37     return 0;
38 } 
39  
View Code

 

 

 

【codeforces】【Round#523D】TV shows

标签:++   pre   erase   event   cli   bsp   tor   hide   \n   

原文地址:https://www.cnblogs.com/Paul-Guderian/p/10014571.html

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