P11453 [USACO24DEC] Deforestation S

news/2025/10/29 19:08:24/文章来源:https://www.cnblogs.com/qwqSW/p/19175140

闲聊:多测一定要清空!!!

以及,听说本题有九倍经验。


题目传送门

我的博客-欢迎光临

本题的做法很多,最主要的一个是差分约束。这里我们介绍另一种做法——并查集+树状数组。(虽然这个做法有点……难评,但我认为它最大的优势是快,我现在是896ms,第二面榜)

首先本题值域太大了,我们要先对位置进行离散化(查询的区间和树的位置都离散化)。接着我们可以对原来的 \(n\) 棵树的位置排序(虽然这没必要)。最后我们把原问题转化为最少保留多少棵树。

然后我们就得到了一坨形似 CSP-S 2024 T2 的东西。我们按右端点从小到大排序,然后分别处理每个区间。

这里就体现本题的贪心标签了:对于一个区间而言,如果当前它的限制还未被满足,尽量往右边选择保留的树一定是不劣的,因为它的上一个区间已经选树完成了不用管,但是下一个区间没考虑完,越往右选树,越有可能使这棵树贡献到下面的区间。

或者说,如果你该区间的选树方案里存在一个靠右的树未被选择,显然你把它选上,并去掉最靠左边的树,这样既能满足该区间的约束,下面的区间要选的树也有可能减少,何乐而不为呢?

这样我们的大体思路就有了:离散化+区间排序+枚举区间求贡献。

但是如果从右往左直接扫的话,经过构造有可能会T飞(本人没试过,如有不对还请斧正)。这时我就想起来了一个套路:用并查集维护最靠右的未被选树的位置。具体来说,我们用 \(fa_i\) 表示 \(i\) 左侧最靠近 \(i\) 的没被选树的位置。初始时 \(fa_i=i\)

这个套路还蛮常见的,但总之当 \(i\) 位置选上树后,我们令 \(fa_i=i-1\),查找某个点前一个未被选树的位置时,直接跑正常的路径压缩即可。

至于树状数组,这个主要是用来判断该区间是否已经满足限制用的。当我们加入一个位置的全部树时,就让当前这个离散化位置在树状数组上加上该位置树的个数,进入下一个区间时直接正常区间查询即可。

由于我们最多会种 \(n\) 棵树,最多有 \(m\) 个约束区间,树状数组的修改和查找是 \(O(\log n)\) 的,所以总时间复杂度 \(O(Tn \log n)\)

其他问题请看代码。

代码:

P11453
#include<cstdio>
#include<algorithm>
using namespace std;inline int read(){int x=0,f=1;char c=getchar();while(c<48){if(c=='-') f=-1;c=getchar();}while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}const int N=1e5+5;
int T,n,m,pos[N],b[N],fa[N],tr[N],num[N];
struct Nahida{int l,r,num;
}q[N];inline void INIT(){for(int i=1;i<=n;i++){fa[i]=i,tr[i]=0,num[i]=0;}
}inline int lowbit(int x){return x&(-x);
}inline bool cmp(Nahida x,Nahida y){return (x.r!=y.r?x.r<y.r:x.l<y.l);
}inline void add(int x,int k){while(x<=n){tr[x]+=k;x+=lowbit(x);}
}inline int query(int x){int ans=0;while(x){ans+=tr[x];x-=lowbit(x);}return ans;
}inline int FIND(int x){return (x==fa[x]?x:fa[x]=FIND(fa[x]));
}signed main(){T=read();while(T--){n=read(),m=read();INIT();//多测一定要检查你该清空的数组是否全部清空//多测记得清空!!! for(int i=1;i<=n;i++){pos[i]=read();b[i]=pos[i];}for(int i=1;i<=m;i++){q[i].l=read(),q[i].r=read(),q[i].num=read();}//离散化 sort(b+1,b+n+1);sort(pos+1,pos+n+1);int len=unique(b+1,b+n+1)-b-1;for(int i=1;i<=n;i++){pos[i]=lower_bound(b+1,b+len+1,pos[i])-b;num[pos[i]]++;//刚才题解里没讲到一个问题,就是一些树的位置可能会重复,所以我们开个桶数组,记录某个位置的树有多少棵 }for(int i=1;i<=m;i++){q[i].l=lower_bound(b+1,b+len+1,q[i].l)-b;q[i].r=upper_bound(b+1,b+len+1,q[i].r)-b-1;/*我离散化的时候没有选择把查询端点也一起扔进去离散化,而是在找第一个大于等于左端点的树的位置和最后一个小于右端点的树的位置,这样我们相当于是把两侧没有树的无用区间忽略掉了在此同时进行了一个离散化 */}sort(q+1,q+m+1,cmp);//根据右端点从小到大排序 int ans=0;for(int i=1;i<=m;i++){int l=q[i].l,r=q[i].r;int dq=query(r)-query(l-1);//dq:当前区间已经有了多少棵树 if(dq>=q[i].num){//当前区间已经种够了,就不用种了 continue;}ans+=q[i].num-dq;//否则就要种这么多棵树 while(dq<q[i].num){//nxt:更具体地说,指的是还没有选树的最靠右的某个位置,这个位置上可以有多棵树 int nxt=FIND(r);add(nxt,num[nxt]);//注意这里可能有多棵树 fa[nxt]=nxt-1;dq+=num[nxt];//用刚种的树的数量更新dq }}//ans记录的是最少留多少树,转换成最多砍多少棵树 printf("%d\n",n-ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SKILL] 常用语句

1. 判断子字符串是否被包含在一个字符串中 index(string1 substring1),index()返回在string1中遇到的第一个substring1及其之后的所有内容,如果不包含substring1则返回nil e.g.string1 = "inv_25_mac" sub…

团队博客 1:团队项目核心信息

我会按照项目核心信息的逻辑顺序,将内容整理为通顺的正常文本格式,去除所有加粗符号,同时保留各部分关键信息和结构,确保信息完整且易于阅读。 租易 - 快捷租房管理小程序:项目核心信息项目的需求分析和商业前景 …

CF2156 Codeforces Round 1061 (Div. 2) 游记(VP)

心不在焉没有状态,$4t$ 混出 $1930$ 就下班。省流 心不在焉没有状态,\(4t\) 混出 \(1930\) 就下班。10.29 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 晚上蚊子很多,没怎么睡觉,处在一种困与不困的叠加态…

2025年10月市场上板式家具厂家前十榜单

随着2025年板式家具行业的快速发展和消费升级,市场竞争日益激烈,企业需注重产品质量、环保标准和服务体验。本文基于行业调研数据、用户口碑评价及企业综合实力,整理出2025年市场上板式家具制造商的推荐排行榜单,旨…

2025年市场上板式家具制造厂综合排名与选购指南

随着家居行业的快速发展,板式家具在2025年呈现出智能化、环保化趋势,市场规模预计年增长率达8%(据中国家具协会报告)。本文基于行业数据和用户口碑,为您权威推荐前十名板式家具制造厂,并提供详细排名表单供参考,…

项目构建优化:git

Git 基本概念与诞生背景 什么是 Git? Git 是一款分布式版本控制系统(Distributed Version Control System),核心作用是管理代码 / 文档的修改历史,支持多人协同开发,能高效追踪版本变化、回溯历史版本、解决代码…

lower_bound upper_bound - Slayer

lower_bound 作用: 返回第一个 大于等于 (>=) 指定值的元素的迭代器。 如果值存在: 返回该值的第一个位置。 如果值不存在: 返回比目标值 大的第一个元素 位置。 如果所有元素都小于目标值: 返回 end() 迭代器。 反…

软件工程学习日志2025.10.29

今天遇到一个经典问题:用户启动 Adobe Dreamweaver 时弹出 0xc000007b 应用程序错误。这个蓝底白字的错误窗口在 Windows 系统中相当常见,通常意味着应用程序的某个核心组件出了问题。 错误根源分析 经过排查,0xc00…

2025年三聚氰胺饰面板源头厂家推荐榜前十强分析

三聚氰胺饰面板行业在2025年持续增长,得益于环保政策和消费升级,市场需求旺盛。本文基于行业数据和分析,推荐前十强厂家,并提供详细评测,帮助用户选择可靠供应商。表单内容供参考,确保信息客观公正。 正文内容 行…

团队博客2:描述团队的每个人如何使用 AI 来高效完成团队任务的

需求分析师(成员 1):用 AI 工具(如 ChatGPT)梳理行业租房痛点,生成 “管理者房源审核、房东信息发布、租客筛选匹配” 的需求清单,还能快速总结竞品核心功能,避免重复调研; 后端开发(成员 2):借助 AI 代码…

2025年国型钢厂家/工厂排名前十:江苏华力冷弯型钢领跑行业

2025年国型钢厂家/工厂排名前十:江苏华力冷弯型钢领跑行业 文章摘要 冷弯型钢行业作为建筑钢结构的重要组成部分,近年来随着基础设施建设和绿色建筑政策的推动,呈现出快速增长趋势。2025年,行业集中度提升,技术创…

Optuna AutoSampler 更新:让多目标和约束优化不再需要手动选算法

AutoSampler是个智能采样器,能根据具体问题自动挑选 Optuna 里最合适的优化算法。这个工具在 OptunaHub 上热度很高,每周下载量超过 3 万次。最早的版本对单目标优化做了专门的自动选择逻辑,为了配合下个月发布的 O…

整理:决策单调性

关于决策单调性的整理 1.决策单调性 在动态规划中,对于类似于 \(f_i=\min_{j=1}^{i-1} f_j+cost(j,i)\) 的转移方程,假设 \(p_i\) 表示 \(i\) 的最优决策点,\(\forall i\le j\) 均有 \(p_i\le p_j\),即称 \(f\) 具…

2025年保安亭源头厂家推荐:合肥荣东智能环保科技的实力解析

文章摘要 本文深入分析2025年保安亭源头厂家的选择标准,重点推荐合肥荣东智能环保科技有限公司。该公司拥有全国18个生产基地,通过ISO三大体系认证,服务过中铁四局、奇瑞集团等知名企业,具备强大的生产能力和品质保…

2025年保安亭厂家推荐排行榜:合肥荣东智能环保科技领先行业

文章摘要 保安亭行业随着城市化进程和安保需求增长而快速发展,2025年预计市场规模将突破百亿元,企业采购时更注重厂家实力、产品质量和售后服务。本文基于市场调研和用户口碑,整理出保安亭厂家推荐排行榜前十名,为…

2025年保安亭源头厂家推荐排行榜:行业深度分析与选购指南

摘要 保安亭行业作为城市安防和智慧城市建设的重要组成部分,近年来随着城市化进程加速和环保意识提升,市场需求持续增长。行业发展趋势偏向智能化、环保化和定制化,厂家竞争日益激烈。本文基于市场调研、用户口碑和…

2025年保安亭源头厂家推荐榜单

文章摘要 保安亭行业在2025年迎来快速发展,注重环保、智能化和定制化趋势,推动城市安全和基础设施升级。本文基于市场调研和用户口碑,整理出保安亭源头厂家排名前十榜单,为采购商和项目方提供参考。榜单综合企业实…

2025年10月垃圾分类房源头订制厂家 top 5 推荐榜单:合肥荣东智能环保科技有限公司

文章摘要 随着环保政策的深入推进和城市化进程加速,垃圾分类房行业迎来爆发式增长,市场需求持续扩大。本文基于用户搜索意图,综合评估产品质量、口碑、服务等因素,推出2025年垃圾分类房品牌订制厂家 top 5 推荐榜单…

2025.10.29

正睿二十连测 B 赛后:\(30min\)有一个大小为 \(2 \times n\) 的网格,\((i, j)\) 的颜色为 \(a_{i, j}\),一次操作可以将 \((1, 1)\) 所在的极大四连通同色连通块染为任意一种颜色 \(c\)。问至少需要多少次操作才能使…

2025年10月垃圾分类房品牌订制厂家深度评测与推荐:揭秘顶级厂家的优势与选购技巧

摘要 随着环保政策的深入推进和城市化进程的加速,垃圾分类房行业迎来快速发展,市场需求持续增长。行业整体趋向智能化、定制化发展,品牌竞争加剧,消费者对产品质量、服务和口碑的关注度提升。本文基于市场调研和用…