P7990-[USACO21DEC]Closest Cow Wins S【堆,贪心】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P7990


1|1题目大意

数轴上有k个点是草地,每个草地有不同收益,m个点是地方的点,现在你要放置n个我方的点,不能和敌方的点重合。

如果一个草地离最近的我方的点距离严格小于最近的敌方点距离,那么这个草地被占领。

给出敌方点和草地坐标(保证两两不同),求占领草地的最大收益和 。

1n,m,k2×105,1x109


1|2解题思路

考虑在两个敌方点之间我们最多放两个己方点,又因为敌方点肯定和草地不重合所以放两个肯定能占领这之间的所有草地。

而且不能放敌方点的限制可以无视因为放敌方点没有任何收益。

然后我们再考虑如何算出两个敌方点之间放一个我方点的最大收益。

显然之间考虑位置很麻烦,我们可以考虑对于一个草地作为最右边的草地,那么一头牛能占领的最左边的草地,这个可以直接用一个双指针维护。

这样我们就得出了每一段放一头/两头牛的收益,记为ci,1/2

此时我们考虑暴力贪心开始把所有的ci,1放进堆里,每次取出的如果是一个ci,1那么把ci,2ci,1再放进堆里做n次就可以了。

看起来这个贪心好像是错的,因为如果ci,2远大于ci,1时我们就可能牺牲第一次取小的来取第二次的。

但是实际上我们用在上面那个过程中不难发现,肯定是有ci,1ci,2ci,1的(因为直接放在左右地方牛的旁边贡献大的那个位置就至少有一半的收益)。

时间复杂度:O(nlogn)

当然我推荐的做法是无脑wqs二分+dp


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define ll long long #define mp(x,y) make_pair(x,y) using namespace std; const ll N=2e5+10; struct node{ ll p,t; }a[N]; ll n,m,k,ans,s[N],f[N],w[N],v[N]; priority_queue<pair<ll,ll> > q; bool cmp(node x,node y) {return x.p<y.p;} signed main() { scanf("%lld%lld%lld",&k,&m,&n); for(ll i=1;i<=k;i++) scanf("%lld%lld",&a[i].p,&a[i].t); for(ll i=1;i<=m;i++)scanf("%lld",&f[i]); sort(a+1,a+1+k,cmp); sort(f+1,f+1+m);f[0]=-1e9;f[m+1]=2e9; ll now=1,l=1,las=0,maxs=0; for(ll i=1;i<=k;i++){ s[i]=s[i-1]+a[i].t; while(l<=m&&f[l]<a[i].p){ w[l]=maxs;v[l]=s[i-1]-s[las]; las=i-1;now=i;maxs=0;l++; } ll L=f[l-1],R=f[l]; while((a[i].p-a[now].p)*2>=R-L)now++; maxs=max(maxs,s[i]-s[now-1]); } w[l]=maxs;v[l]=s[n]-s[las]; for(ll i=0;i<=k+1;i++) q.push(mp(w[i],i)); for(ll i=1;i<=n;i++){ pair<ll,ll> w=q.top(); ans+=w.first;q.pop(); if(w.second)q.push(mp(v[w.second]-w.first,0)); } printf("%lld\n",ans); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15728773.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(123)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示