NOIP2015 T4 推销员 贪心+堆优化
前几天在学堆,这个数据结构貌似挺简单的,但是我看了很久啊QAQ...
今天算是搞懂了吧...于是想到了这道题...(当初悄悄咪咪看题解记得一点)
放洛谷的题...
题意的话,大概就是有n个房子在一条直线上,每个房子有一个离起点的距离,还有一个价值。
然后n个询问,第 i 个表示选 i 个房子能得到的最大总价值。总价值指 最远距离*2+每一个推销房子的价值。
有一个前提,不多走路,也就是说这个最远距离必须是某个要推销的房子。
思路:我萌可以考虑一下贪心,对于第i个询问,是否可以从第 i-1 个询问的基础上来得到捏?
当然可以辣!(然而不会证明QAQ)
辣我萌就假装证明完了的样子,
所以第 i 个询问的答案只需要在第 i-1 的询问答案加上一个最优值,也就是选择一个地方进行推销。
我萌可以这样考虑,假设在第 i-1 个询问的答案为lastans,这个最优解当前的最远房子为max
然后分类讨论,对于一个房子 x ,如果在max左边(x<max),辣么这个房子对答案的影响为 a[x]。
如果在max右边(x>max),辣么这个房子对答案的影响为 s[x]*2+a[x]-s[max]*2。
所以我萌每次都在去枚举一重 x 找到影响最大的,然后输出 lastans+影响值。
并更新 lastans和max。
但对于100%的数据O(n^2)是要tle的,辣就想想优化。
找最大值!会想到很多数据结构都可以维护。这里我选了刚学的堆。当然有很大原因是因为之前看的题解是堆
如何去优化捏。这样考虑,对于 x<max 的情况建一个堆heap0,对于 x>max 的情况建一个堆heap1。
刚开始的时候把heap1这个堆初始为全部 s[i]*2+a[i] (1≤i≤n) heap0这个堆初始为空。
然后每次查询前,如果heap1的堆首是<=max的就都删掉。
比较一下heap1的堆首和heap0的堆首,更新。
如果heap1的堆首更优,就把所有 没在heap0堆的且小于新max的都加入到heap0堆里。
这题我觉得题灰常的好啊QAQ,毕竟花了好久才搞出来...不过必须吐槽官方数据太弱了...
type
node=record
num:longint;
id:longint;
end;
var n,i,j:longint;
num,lastans:longint;
max,x:longint;
s,a:array[..]of longint;
v:array[..]of boolean;
heap:array[..,..]of node; tot,tot0:longint;
procedure swap(var a,b:node);
var t:node;
begin
t:=a;a:=b;b:=t;
end;
procedure down(x,b:longint);
begin
while x*<=n do
begin
if heap[x*,b].num>heap[x*+,b].num then
begin
if heap[x,b].num<heap[x*,b].num then
begin
swap(heap[x,b],heap[x*,b]);
x:=x*;
end else break;
end else
begin
if heap[x,b].num<heap[x*+,b].num then
begin
swap(heap[x,b],heap[x*+,b]);
x:=x*+;
end else break;
end;
end;
end;
procedure up(x:longint);
begin
while x> do
begin
if heap[x div ,].num<heap[x,].num then
begin
swap(heap[x div ,],heap[x,]);
x:=x div ;
end else break;
end;
end;
procedure build(n:longint);
var i:longint;
begin
for i:=n div downto do
down(i,);
end;
begin
read(n);
for i:= to n do
read(s[i]);
for i:= to n do
read(a[i]);
for i:= to n do
begin
heap[i,].num:=s[i]*+a[i];
heap[i,].id:=i;
end;
tot:=n;
build(n);
for i:= to n do
begin
while (heap[,].id<=max)and(tot>) do
begin
heap[,].num:=;
swap(heap[,],heap[tot,]);
down(,);
dec(tot);
end;
if (heap[,].num+lastans>num) then
begin
num:=lastans+heap[,].num;
x:=heap[,].id;
end;
if heap[,].num+lastans-s[max]*>num then
begin
num:=heap[,].num+lastans-s[max]*;
x:=heap[,].id;
for j:= to x- do
if not v[j] then
begin
v[j]:=true;
inc(tot0);
heap[tot0,].num:=a[j];
heap[tot0,].id:=j;
up(tot0);
end;
max:=x;
end;
writeln(num);
lastans:=num;
if x<max then
begin
heap[,].num:=;
swap(heap[,],heap[tot0,]);
down(,);
dec(tot0);
end;
end;
end. //堆的维护都是自己写的,很丑啊QAQ
NOIP2015 T4
NOIP2015 T4 推销员 贪心+堆优化的更多相关文章
- bzoj1555 KD之死 贪心+堆优化
1555: KD之死 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 124 Solved: 54[Submit][Status][Discuss] D ...
- [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)
题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...
- 【BZOJ1029】[JSOI2007] 建筑抢修(堆优化贪心)
点此看题面 大致题意: 有N个受到严重损伤的建筑,对于每个建筑,修好它需要\(T1\)秒,且必须在\(T2\)秒之前修完(\(T1\)与\(T2\)不是固定值),问你最多能修好几个建筑. 题解 一看到 ...
- Codeforces Round #303 (Div. 2) E. Paths and Trees Dijkstra堆优化+贪心(!!!)
E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- 学习笔记·堆优化$\mathscr{dijkstra}$
嘤嘤嘤今天被迫学了这个算法--其实对于学习图论来说我内心是拒绝的\(\mathscr{qnq}\) 由于发现关于这个\(\mathscr{SPFA}\)的时间复杂度\(O(kE)\)中的\(k \ap ...
- Dijkstra+优先队列 堆优化
关于堆优化 传统\(Dijkstra\),在选取中转站时,是遍历取当前最小距离节点,但是我们其实可以利用小根堆(STL的priority_queue)优化这个过程,从而大大降低复杂(\(O(V2+E) ...
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- 【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra
题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神秘生物 ...
- 【bzoj5047】空间传送装置 堆优化Dijkstra
题目描述 n个点e条边的有向图,每条边是m种类型之一.第i种类型在第x时刻通过所花费的时间为$(a_i*x+b_i)\mod c_i+d_i$.可以在某个点停留.问:在s时刻从1号点出发,到达每个点所 ...
随机推荐
- Netty 应用程序的一个一般准则:尽可能的重用 EventLoop,以减少线程创建所带来的开销。
Netty 系列一(核心组件和实例). - JMCui - 博客园 https://www.cnblogs.com/jmcui/p/9154842.html 阅读目录 一.概念 二.核心组件 三.实例 ...
- Javascript闭包学习(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...
- 二叉树的先序、中序、后序和中序遍历——Java实现
package treeTraverse; /** * 定义一个树的结点类 */ public class Node { private int data; private Node leftChil ...
- Ubuntu 12.04安装Google Chrome(转)
下载google chrome deb包,下载地址:https://www.google.com/chrome/browser/desktop/index.html,google的网站被墙了,如果你下 ...
- Pandas -- SettingwithCopyWarning 原理和解决方案(转)
本文对产生 SettingwithCopyWarning 的原因以及解决方案,做了详细解说. 详见: https://www.jianshu.com/p/72274ccb647a
- javascript 之 typeof 与 instanceof
1.typeof:返回一个表达式的数据类型的字符串 返回结果为js的数据类型,包括number,boolean,string,object,undefined,function. var a = 1; ...
- java7(1)——反编译深入理解增强的switch(读字节命令实战)
[本文介绍] 本文主要讲java_7 的改进switch的底层实现.反编译一个使用带String的switch的demo并一步步解析反编译出来的字节命令,从编译的角度解读switch的底层实现. [正 ...
- 【spring学习】中文乱码问题
问题: 在这样的一个控制器中: 返回字符串中文部分全是问号. 解决方案: 在spring-mvc.xml文件中加入以下代码: <!-- 支持spring3.0新的mvc注解 ,解决json中的中 ...
- HBase在HDFS上的目录树
众所周知,HBase 是天生就是架设在 HDFS 上,在这个分布式文件系统中,HBase 是怎么去构建自己的目录树的呢? 这里只介绍系统级别的目录树: 一.0.94-cdh4.2.1版本 系统级别的一 ...
- kettle转换添加hbase-output无法获取hbase表
问题:kettle转换添加hbase-output无法获取hbase表 win本机安装kettle,本机虚拟机三台,root用户安装有jdk.zookeeper.hadoop.hbase kettle ...