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号点出发,到达每个点所 ...
随机推荐
- Apache Kafka源码分析 – Replica and Partition
Replica 对于local replica, 需要记录highWatermarkValue,表示当前已经committed的数据对于remote replica,需要记录logEndOffsetV ...
- Linux磁盘分区工具的使用
----------fdisk分区工具---------- 一..下面来介绍fdisk分区工具的命令格式: fdisk是传统的Linux硬盘分区工具,也是Linux系统中最常用的一种硬盘分区 ...
- SpringBoot 之数据访问
1. Spring Boot 与 JDBC 默认使用 org.apache.tomcat.jdbc.pool.DataSource 数据源; // application.yml spring: da ...
- Java8 新特性之Lambda表达式
1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...
- King's Game---hdu5643(约瑟夫环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5643 约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从 ...
- Pycharm配置同步服务器
一.使用场景 我们一般需要将代码放到服务器上运行,但如果等我们将项目全部开发好之后再上传到服务器,而且每次在开发阶段需要经过多次修改,每修改一次,都手动上传一次,这样就太麻烦了,有没有一种方法可以达到 ...
- oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件
[本文介绍] 学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作.也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情 ...
- 图书源代码下载: Modern Differential Geometry of CURVES and SURFACES with Mathematica
http://alpha01.dm.unito.it/personalpages/abbena/gray/ Contents 1. Curves in the Plane | 2. Famou ...
- LDPC知识点
LDPC:low Density Parity Check BCH:以前NAND的纠错 80s TLC以镁光都是以LDPC纠错. 对比: BCH:超过阈值就绝对纠正不回来了. LDPC:纠正的结果是一 ...
- NAND flash阵营ToggleDDR和ONFI
NAND 闪存:目前闪存制造厂主要分为三星与东芝.海力士联合的ToggleDDR阵营和英特尔与美光为首的ONFI阵营 IM Flash Technologies(IMFT):由Intel和Micron ...