[arc076f]Exhausted? - 贪心
2024-09-08 17:13:08
题意:
给你m个椅子可以坐人,初始坐标为正整数1~m,有n个人,每个人希望坐的位置$\leq L_i$或者$\geq R_i$,可以添加若干个椅子在任意的实数位置,求最少要添加多少椅子使得所有人都有位置坐?
$1\leq n,m\leq 2\times 10^5$
$0\leq L_i<R_i\leq m+1$
题解:
这题其实有一个显然的网络流解法,但是直接建图会爆,用线段树优化建图可以过,写的会很麻烦。。。(Orzckw)
场上dalao们八仙过海以不同的姿势各种贪心水到了大量分数。。。
正解是一个优秀的贪心。考虑只有一边的限制(比如只有$L$),那么显然的贪心是,从左到右枚举每个椅子,在$L_i$处决定每个人坐在哪,然后每向后一个椅子就能多放一个,考虑有多少人左端点在当前枚举到的椅子,能放就尽量放,多的就不放,并将空位设为0;
加上$R$的条件其实类似,把每个人记录在$L$上,然后能放就尽量放,遇到放不下的情况时可以考虑用新的这个人代替掉原来的人,条件是他的$R$比原来的人的$R$要大,这样可以保证换出来的人更容易重新放进去。那么用小根堆维护$R$,然后扫一遍即可;
枚举完把放好的人拎到一边,反着做一次只考虑$R$的贪心,即可求出答案。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
struct task{
int l,r;
}a[];
priority_queue<int>q;
pair<int,int>pi[];
bool cmp(task a,task b){
return a.l==b.l?a.r<b.r:a.l<b.l;
}
int n,m,l,r,tot=,ans=,now[];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d%d",&a[i].l,&a[i].r);
sort(a+,a+n+,cmp);
l=,r=m;
for(int i=;i<=n;i++){
q.push(-a[i].r);
if(l<=r&&l<=a[i].l)l++;
else{
now[++tot]=-q.top();
q.pop();
}
}
sort(now+,now+tot+);
for(int i=tot;i;i--){
if(l<=r&&r>=now[i])r--;
else ans++;
}
printf("%d",ans);
return ;
}
最新文章
- jquery的checkbox 全选和全不选
- [转]maven安装以及eclipse配置maven
- Grails 对象关联映射 (GORM) 一
- 使用Script元素发送JSONP请求
- elasticsearch常用的插件
- 动态树LCT
- C# String 与 byte 互转
- Android 锁屏状态/锁屏密码等相关
- RAC优化大框架的分配(jumbo frame)
- Iterator——迭代接口
- Java面试系列
- phpcms ——模板标签详细使用说明
- 如何把我的Java程序变成exe文件?
- IBM与麻省理工学院联合建立AI实验室 承诺投资2.4亿美元
- HDU2036 改革春风吹满地
- 在Tomcat中配置单点登录
- c语言第二次作业2
- VUE 安装及项目创建
- laradock
- SQL Server 创建索引方法
热门文章
- ZBrush中移动笔刷介绍
- BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法
- CF859C Pie Rules 动态规划 逆推_思维题
- 使用json_decode无法解析json
- org.xml.sax.SAXParseException: Failed to read schema document 的原因分析与解决方法
- php的更新
- H5图片上传、压缩
- java实现随机数的生成
- sqrt开平方算法的尝试,是的看了卡马克大叔的代码,我来试试用C#写个0x5f3759df和0x5f375a86跟System.Math.Sqrt到底哪个更强
- bitset优化背包