正题

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


题目大意

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

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

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

\(1\leq n,m,k\leq 2\times10^5,1\leq x\leq 10^9\)


解题思路

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

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

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

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

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

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

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

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

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

当然我推荐的做法是无脑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. [USACO12FEB]牛券Cow Coupons(堆,贪心)

    [USACO12FEB]牛券Cow Coupons(堆,贪心) 题目描述 Farmer John needs new cows! There are N cows for sale (1 <= ...

  2. BZOJ_2802_[Poi2012]Warehouse Store_堆+贪心

    BZOJ_2802_[Poi2012]Warehouse Store_堆+贪心 Description 有一家专卖一种商品的店,考虑连续的n天. 第i天上午会进货Ai件商品,中午的时候会有顾客需要购买 ...

  3. BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心

    BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心 Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏 ...

  4. poj3045 Cow Acrobats (思维,贪心)

    题目: poj3045 Cow Acrobats 解析: 贪心题,类似于国王游戏 考虑两个相邻的牛\(i\),\(j\) 设他们上面的牛的重量一共为\(sum\) 把\(i\)放在上面,危险值分别为\ ...

  5. P4053 [JSOI2007]建筑抢修 堆贪心

    思路:堆贪心 提交:1次 题解: 先按时间\(sort\),然后如果能修就直接扔堆里,不能修取堆顶比一下时间长短,把时间短的扔进堆: #include<cstdio> #include&l ...

  6. HDU5124lines题解-堆+贪心的一个新方法

    题目链接 https://cn.vjudge.net/problem/HDU-5124 胡扯 感觉说新方法好像有点不太好,但是翻了十几篇博客都是清一色离散化之类的... 为什么会做这道题呢?因为前几天 ...

  7. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

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

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

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

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

随机推荐

  1. 在Winform框架的多文档界面中实现双击子窗口单独弹出或拖出及拽回的处理

    在基于DevExpress的多文档窗口界面中,我们一般使用XtraTabbedMdiManager来管理多文档窗口的一些特性,如顶部菜单,页面的关闭按钮处理,以及一些特殊的设置,本篇随笔介绍这些特点, ...

  2. [SDOI2012] Longge 的问题

    题意 求\(\sum_{i}^{n} gcd(i,n)\) 想法 套路题 \(\sum_{i}^{n} gcd(i,n)\) \(=\) \(\sum_{i,i | n} i * phi(n/i)\) ...

  3. three.js很好玩

    能用鼠标拉着转. https://files.cnblogs.com/files/blogs/714801/%E7%A9%BA%E9%97%B4%E5%87%A0%E4%BD%95.7z var po ...

  4. Spark(二十一)【SparkSQL读取Kudu,写入Kafka】

    目录 SparkSQL读取Kudu,写出到Kafka 1. pom.xml 依赖 2.将KafkaProducer利用lazy val的方式进行包装, 创建KafkaSink 3.利用广播变量,将Ka ...

  5. LINUX 系统性能检测工具vmstat

    vmstat 有2个参数,第一个是采样时间间隔(单位是s),第二个参数是采样个数. #表示 2s采样一次,一共采样2次 vmstat 2 2 也可以只写第一个参数,让系统一直采样直到停止(ctrl + ...

  6. Hibernate持久化标志符生成策略

    generator子元素定义持久化标识符的生成策略,为持久化类对应的数据库表的主键找到了赋值方法,HIbernate默认将使用assigned的持久化标识符生成策略.关系型数据库的主键定义方式:(1) ...

  7. HTML样式 背景

    当浏览器读到一个样式表,就会按照这个格式表来对文档进行格式化.有以下三种方式来插入样式表: 1.外部样式表 当样式需要用到很多页面的时候,外部样式是理想的选择.使用外部样式表,就可以听过更改一个文件来 ...

  8. virtualBox 系统移植

    把virtualbox已经存在的系统移植到其他机器. 1.把系统如下文件考到一个安装了virtualbox的机器. 2.点击控制-->注册 然后浏览到复制的文件路径. 3.修改uuid 不管是l ...

  9. struct vs class in C++

    在C++中,除了以下几点外,struct和class是相同的. (1)class的成员的默认访问控制是private,而struct的成员的默认访问权限是public. 例如,program 1会编译 ...

  10. SpringMVC中@RestController和@Controller的区别

    在使用SpringMVC时,对于Controller中的注解@RestController和@Controller需要我们区分清楚 @RestController注解相当于@ResponseBody和 ...