当前位置: 首页 > news >正文

【题解】P11453 [USACO24DEC] Deforestation S

题意

数轴上有 \(n\) 个整点,求最多删除多少个整点,使得 \(k\) 个条件依然满足。每个条件形如:在 \([l_i,r_i]\) 范围内至少存在 \(t_i\) 个整点。

思路

删点操作有悖于满足条件的逻辑,因此正难则反,考虑最少保留多少个点使得所有条件被满足。为了使点数最少,应使每个点贡献的区间尽可能多,不难想到贪心求解,对所有条件的区间按右端点从小到大排序,从右端点往左取点直至满足条件,并更新覆盖这些点的其他区间还需要取的点数。

动态维护区间信息,考虑使用线段树。因值域到达 \(\pm 10^9\),而区间覆盖又只考虑坐标的大小关系,所以先对坐标离散化。线段树要维护两个信息:该区间已选的点数和该区间最靠右的点。按右端点从小到大枚举每个条件,在该区间中找最靠右的点然后将其删掉,循环往复直至满足要求,继续求解下一条件。最终答案即为总点数 \(n\) 减去取得的点数。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int T,n,k;
int pos[N];
struct Law{int l,r,t;
}lmt[N];
struct Node{int cnt,uns;int l,r;
};
struct Segtr{Node tr[4*N];void push_up(int p){tr[p].cnt=tr[2*p].cnt+tr[2*p+1].cnt;tr[p].uns=max(tr[2*p].uns,tr[2*p+1].uns);}void build(int p,int l,int r){tr[p].l=l,tr[p].r=r;if(l==r){tr[p].cnt=0,tr[p].uns=l;return ;}int mid=(l+r)>>1;build(2*p,l,mid);build(2*p+1,mid+1,r);push_up(p);}void update(int p,int l,int r,int k){if(l==r){tr[p].cnt=1,tr[p].uns=0;return ;}int mid=(l+r)>>1;if(k<=mid) update(2*p,l,mid,k);else update(2*p+1,mid+1,r,k);push_up(p);}Node query(int p,int l,int r){Node val={0,0};if(l<=tr[p].l&&tr[p].r<=r) return tr[p];int mid=(tr[p].l+tr[p].r)>>1;if(l<=mid){Node q=query(2*p,l,r);val.cnt+=q.cnt;val.uns=max(val.uns,q.uns);}if(r>mid){Node q=query(2*p+1,l,r);val.cnt+=q.cnt;val.uns=max(val.uns,q.uns);}return val;}
}seg;
bool cmp(Law x,Law y){return x.r<y.r;
}
int main(){scanf("%d",&T);while(T--){scanf("%d%d",&n,&k);for(int i=1;i<=n;i++) scanf("%d",&pos[i]);sort(pos+1,pos+1+n);for(int i=1;i<=k;i++) scanf("%d%d%d",&lmt[i].l,&lmt[i].r,&lmt[i].t);sort(lmt+1,lmt+1+k,cmp);for(int i=1;i<=k;i++){if(!lmt[i].t) lmt[i].l=lmt[i].r=1,lmt[i].t=0;else{lmt[i].l=(lower_bound(pos+1,pos+1+n,lmt[i].l)-pos);lmt[i].r=(upper_bound(pos+1,pos+1+n,lmt[i].r)-pos)-1;}}seg.build(1,1,n);for(int i=1;i<=k;i++){Node ans=seg.query(1,lmt[i].l,lmt[i].r);while(ans.cnt<lmt[i].t){seg.update(1,1,n,ans.uns);ans=seg.query(1,lmt[i].l,lmt[i].r);}}printf("%d\n",n-seg.query(1,1,n).cnt);}return 0;
}

时间复杂度 \(O(n\log n)\)

http://www.rkmt.cn/news/89229.html

相关文章:

  • 【dl】【WSL2】如何获得“Winux”?Windows 上的 Linux 子系统 —— 比虚拟机更好的选择
  • CSS3动画:2D/3D转换全解析
  • P2014 [CTSC1997] 选课
  • 彻底讲清 MySQL InnoDB 锁机制:从 Record 到 Next-Key 的全景理解
  • MCU的启动流程你了解么?
  • I2C通信最全面的讲解:从协议到硬件设计
  • 【题解】Luogu P10752 [COI 2024] Sirologija
  • Python字符串:别只用来打印!这5个高级用法让代码效率翻倍
  • 【题解】Atcoder ABC432 C
  • 赶due党救急!论文降重2小时搞定,不熬夜
  • 计算机论文模板推荐:8大平台+AI修改工具
  • 期待回家,顺便写点年度总结
  • E No address added out of total 1 resolved地址绑定失败: No address added out of total 1 resolved errors:
  • JavaScript 异常原因(Error Cause):实现分布式系统错误链追踪的序列化与反序列化
  • JavaScript 记录(Records)与 元组(Tuples):实现堆内存中不可变复合数据结构的内存布局
  • 线程并发编程,同步与互斥机制
  • Python列表与元组:搞懂这3个核心差异,再也不纠结用哪个
  • MQ消息队列相关知识与对比
  • 完整教程:PPT导出为图片的格式选择:JPG与PNG的区别
  • 代码随想录算法训练营第三十二天 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、卡码网57. 爬楼梯
  • 基于深度学习的文物图像修复系统
  • JavaScript 引擎中的分支预测器(Branch Predictor)友好性:如何写出减少 CPU 误判的代码
  • Day 37 - 早停策略与模型权重的保存
  • 【SOVD】软件定义汽车时代的诊断新范式
  • 最全词典整合收录:打造专业英语学习利器
  • C盘哪些文件可以删除?
  • 18、深入了解 Linux 文件系统:导航与分区指南
  • PLM系统更专业化:更适配汽车电子芯片半导体研发的高标准管理选择——全星研发项目管理APQP软件系统应用解析
  • 磁盘清理工具没反应怎么办
  • 从入门到转行:网络安全自学与跳槽的终极建议