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

题意是给你n个节目,每次租一台电视需要消耗x+(r-l)*y元,问你怎么样安排才能使得看完所有节目并且消费最少,输出最少的金额

做法是按节目开始时间l排序,遍历所有节目,如果该节目不能在已有的电视上播放或者在已有的电视上播放消耗比再去借一台更多的时候,

那么就再去借一台电视机,当有多个电视机可以播放的时候,贪心选择r最大的电视机.由于是按l升序排序,当(tv[i].l-r)*y>x的时候则表明此时

用已有的电视机播放不如再去借一台,而剩下的l只会更大,所以要erase当前的电视机,否则会超时.PS:WA了好多发,最后发现是开了set没有开multiset,哭了QAQ

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
struct node
{
    ll l,r;
} tv[100005];
bool cmp(node a,node b)
{
    if(a.l==b.l)return a.r<b.r;
    return a.l<b.l;
}
multiset<ll>q;
int main()
{
    ll n,x,y;
    scanf("%lld%lld%lld",&n,&x,&y);
    for (int i=0; i<n; i++ )
    {
        scanf("%lld%lld",&tv[i].l,&tv[i].r);
    }
    sort(tv,tv+n,cmp);
    int cnt=0;
    ll ans=0;
    for (int i=0; i<n; i++ )
    {
        int flag=1;
        auto tmp=q.begin();
        for(auto it=q.begin(); it!=q.end(); )
        {
            ll r=*it;
            if(tv[i].l<=r)
            {
                break;
            }
            if((tv[i].l-r)*y<=x)
            {
                tmp=it;
                flag=0;
                it++;
            }
            else
            {
                q.erase(it);
                it=q.begin();
            }
        }
        if(flag)
        {
            ans=((ans+x)%mod+(y*((tv[i].r-tv[i].l)%mod))%mod)%mod;
            q.insert(tv[i].r);
        }
        else
        {
            ll r=*tmp;
            ans=(ans+(((tv[i].r-r)%mod)*y)%mod)%mod;
            q.erase(tmp);
            q.insert(tv[i].r);
        }
    }
    cout<<ans;
    return 0;
}

  

原文地址:https://www.cnblogs.com/Json-Five/p/10010105.html

时间: 2024-08-30 15:37:11

Codeforces Round #524 (Div. 2)D - TV Shows的相关文章

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

传送门 https://www.cnblogs.com/violet-acmer/p/10005351.html 题意: 有n个节目,每个节目都有个开始时间和结束时间. 定义x,y分别为租电视需要的花费和组完后 原文地址:https://www.cnblogs.com/violet-acmer/p/10050210.html

Codeforces Round #524 (Div. 2) B. Margarite and the best present

B. Margarite and the best present 题目链接:https://codeforces.com/contest/1080/problem/B 题意: 给出一个数列:an=(-1)n,之后有询问,问 [l,r] 之间的ai和为多少. 题解:这个分情况讨论一下就可以了,区间长度的奇偶数丶左端点的奇偶数. 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include

Codeforces Round #524 (Div. 2) codeforces 1080A~1080F

目录 codeforces1080A codeforces 1080B codeforces 1080C codeforces 1080D codeforces 1080E codeforces 1080F codeforces1080A 传送门:https://codeforces.com/contest/1080/problem/A 题意:制造一份邀请函需要2份a物品,5份b物品,8份c物品,一个盒子里面有k份物品(可以为a或b或c)问你制造n份邀请函需要用多少个盒子 题解:直接加起来就行

Codeforces Round #524 (Div.2)题解

题解 CF1080A [Petya and Origami] 这道题其实要我们求的就是 \[\lceil 2*n/k \rceil + \lceil 5*n/k \rceil + \lceil 2*n/k \rceil\] 然后就做完了 # include <bits/stdc++.h> # define ll long long int main() { ll n, k; scanf("%lld%lld", &n, &k); ll ans = ((2 *

Codeforces Round #524 (Div. 2) C. Masha and two friends

C. Masha and two friends 题目链接:https://codeforc.es/contest/1080/problem/C 题意: 给出一个黑白相间的n*m的矩阵,现在先对一个子矩阵颜色变为白色,然后再对一个子矩阵颜色变为黑色,问最终白色格子和黑色格子有多少? 题解: 定义w(a,b)为(1,1)到(a,b)中白色的数量,通过观察找规律可以发现w(a,b)=((b+1)/2)*((a+1)/2)+(b/2)*(a/2). 然后b(a,b)就是格子总数量减去w(a,b). 现

Codeforces Round #524 (Div. 2)

好不容易考完电路,又可以回来刷题了,只是现在恐怕码力连新生都比不上了. A Petya and Origami 开头就是一大水题,意思就是制作一张贺卡需要几张什么颜色的纸,一共做n份,一叠纸有k张纸,问你需要几叠纸. 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int main() 5 { 6 int n,k; 7 scanf("%d%d",&n,&k); 8 p

Codeforces Round #524 (Div. 2) F

题解: 首先这个东西因为强制在线区间查询 所以外面得套线段树了 然后考虑几条线段怎么判定 我们只需要按照右端点排序,然后查询的时候查找最右节点的前缀最大值就可以了 然后怎么合并子区间信息呢 (刚开始我很zz的觉得应该要线段树合并..) 线段树都保证了区间一样大每个点暴力也就会算log次.. 于是就直接暴力合并就好了 复杂度$nlog^2$ 然后因为是cf题..完全不管常数 成功跑了luogu倒数rank1 代码: #include <bits/stdc++.h> using namespace

Codeforces Round #260 (Div. 1) A. Boredom (DP)

题目链接:http://codeforces.com/problemset/problem/455/A A. Boredom time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Alex doesn't like boredom. That's why whenever he gets bored, he comes up with

Codeforces Round #118 (Div. 1) A Mushroom Scientists (多元函数极值问题+拉格朗日乘数法)

Codeforces Round #118 (Div. 1) A Mushroom Scientists 题意:提炼出来就是求f(x,y,z)=x^a*y^b*z^b,这个三元函数在(0 思路: 更严格的还要证明在边界所取到的值比极值要小. 注意:%.10lf注意看题目的output AC代码: #include int main(){ int s; ... meilijie.com/ask/view/377116/ meilijie.com/ask/view/377668/ meilijie.