正题

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


题目大意

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

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

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

1≤n,m,k≤2×105,1≤x≤1091\leq n,m,k\leq 2\times10^5,1\leq x\leq 10^91≤n,m,k≤2×105,1≤x≤109


解题思路

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

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

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

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

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

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

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

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

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)

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


code

#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;
}

P7990-[USACO21DEC]Closest Cow Wins S【堆,贪心】相关推荐

  1. Closest Cow Wins S 最近的奶牛获胜

    Closest Cow Wins S 最近的奶牛获胜 题目传送门 文章目录 Closest Cow Wins S 最近的奶牛获胜 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 # ...

  2. 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心

    SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. 1 #include <iostream> 2 #include <c ...

  3. |Tyvj|NOIP2004|堆|贪心|P1066 合并果子

    http://tyvj.cn/p/1066 贪心地先把所有果子放进小根堆,然后取出两个最小值相加后再放进去,在此期间ans+=两个最小值的和,直到只剩1个元素停止 #include<cstdio ...

  4. P4989-二进制之谜【堆,贪心】

    正题 题目链接:https://www.luogu.org/problemnew/show/P4989 题目大意 一个二进制数两两配对,要求 配对的数不能交叉(用同一个区间但不包含) 0在前1在后 要 ...

  5. jzoj1082-合并果子【堆,贪心】

    题目 有n堆大小不同的果子堆,每次合并两堆消耗它们两堆的重量之和,求把它们全部合并的最小消耗 输入 输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数.第二行包含 ...

  6. 【洛谷】【堆+贪心】P1484 种树

    [题目描述:] cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种 ...

  7. [堆+贪心] CF596C. Wilbur and Points

    CF596C. Wilbur and Points 题意: 太难懂了.有一个平面点集,对集合中任意一点(x,y),满足以原点和(x,y)构成的矩形边上和内部的所有点也都在集合里. 现在要给点标号,为了 ...

  8. BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心

    1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者.但 ...

  9. 11.03 P73 模拟+堆+贪心

    第二题 问题描述 题解 代码 死亡 问题描述 题解 代码 凝视 问题描述 错的不严格题解 bug 代码 tips 每个测试点时限 1 秒 1 秒 1 秒 内存限制 512MB 512MB 512MB ...

最新文章

  1. 数据结构与算法:15 树
  2. x window的奥秘
  3. Html标签带来的安全隐患
  4. step1 . day5 C语言基础练习之日历(使用函数调用,优化至元年开始时间)
  5. C# 在PC上的通过蓝牙(bluetooth)发送数据到手机
  6. Test of etco
  7. 第八届蓝桥杯-日期问题
  8. 【Python学习】 - Matplotlib二维绘图 - plt.matshow()和plt.imshow()区别对比
  9. 计算机网络 第六章 应用层
  10. iOS警报– UIAlertController
  11. 汇编心得(一)在32位机上实现64位数的相加
  12. 软件测试整理复习(简答题)转载请经由作者同意
  13. idea常用快捷键以及自定义快捷键
  14. HD Audio总线驱动加载失败彻底解决!
  15. 五个手指含义(必会)
  16. 加字邮票价格_SC2 “华东区生产图邮票”加字改值 价格收藏图片
  17. 从表征到行动---意向性的自然主义进路(续八)
  18. Google JavaScript规范
  19. 论Web Service 相关技术
  20. rnnlm源码分析 一

热门文章

  1. php prettyprinter,gdb运行时错误:prettyprinter已注册:libstdc++v6
  2. java 图片压缩 base64_图片改变像素,宽高,Base64编码处理
  3. 测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~
  4. 你真的知道Java同步锁何时释放?
  5. ab压力测试_Apache ab压力测试的知识点
  6. activity 防止多次打开_Android开发Activity任务和返回栈
  7. mysqlbinlog工具_mysqlbinlog命令详解 Part 1-实验环境准备
  8. vue 前端设置允许跨域_web 前端的一些小问题
  9. 10-3 5-3 查询生产最高速度的计算机(PC或便携式电脑)厂商 (20 分)
  10. webpack入门核心知识还看不过瘾?速来围观万字入门进阶知识