[arc076F]Exhausted? 贪心+堆

本文介绍了一个算法问题:在已有的椅子布局中,为了满足特定条件的就座需求,需要计算最少需要添加多少个额外的椅子。该算法通过排序和堆维护来解决此问题,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

​ 有m个椅子,第i个在位置i,每个椅子只能坐一个人。  有n个人,第i个人能坐的椅子的位置j需满足j≤Li或j≥Ri。  现在你可以添加若干个椅子,可以放在任意实数位置。问最少加多少个

Input

​ 第一行两个整数N,MN,M

​ 接下来NN行,每行两个整数Li,RiLi,Ri

Output

​ 输出最小需要增加的数量

Sample Input

Case 1:
4 4
0 3
2 3
1 3
3 4

Case 2:
7 6
0 7
1 5
3 6
2 7
1 6
2 6
3 7

Case 3:
3 1
1 2
1 2
1 2

Case 4:
6 6
1 6
1 6
1 5
1 5
2 6
2 6

Sample Output

Case 1:
0

Case 2:
2

Case 3:
2

Case 4:
2

HINT

​ 1≤N,M≤2∗1051≤N,M≤2∗105

​ 0≤Li<Ri≤M+1(1≤i≤N)0≤Li<Ri≤M+1(1≤i≤N)

​ 所有输入的数都是正整数

Sol

我们把左端点排序,然后用一个堆维护左边安排不下的人的r,每次如果还有空位置就直接放,没有的话就把堆里最大值和现在作比较,选择大的安排座位,小的放堆里

之后右边按顺序安排即可。

Code

#include <bits/stdc++.h>
using namespace std;
int n,m,L,R,hr[200005],ans;priority_queue<int,vector<int>,greater<int> >h;vector<int>hl[200005];char c;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0,l,r;i<n;i++) scanf("%d%d",&l,&r),hl[l].push_back(r);
    for(int i=1,t;i<=m;i++) for(vector<int>::iterator it=hl[i].begin();it!=hl[i].end();it++)
    {
        if(L<i){L++,h.push(*it); continue;}
        t=h.top();
        if(t>=*it) hr[*it]++;
        else h.pop(),hr[t]++,h.push(*it);
    }
    for(vector<int>::iterator it=hl[0].begin();it!=hl[0].end();it++) hr[*it]++;
    R=m+1;ans=hr[m+1];
    for(int i=m;i;i--) for(;hr[i]>0;hr[i]--) if(i<R&&L<R-1) R--;else ans++;
    printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/CK6100LGEV2/p/9506546.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值