NOIP2015普及组T4推销员(暴力+线段树)
题目:阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有N家住户,第i家住户到入口的距离为Si米。由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等。阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去。
阿明每走1米就会积累1点疲劳值,向第i家住户推销产品会积累Ai点疲劳值。阿明是工作狂,他想知道,对于不同的X,在不走多余的路的前提下,他最多可以积累多少点疲劳值
输入格式:
第一行有一个正整数N,表示螺丝街住户的数量。
接下来的一行有N个正整数,其中第i个整数Si表示第i家住户到入口的距离。数据保证S1≤S2≤…≤Sn<10^8。
接下来的一行有N个正整数,其中第i个整数Ai表示向第i户住户推销产品会积累的疲劳值。数据保证Ai<10^3。
输出格式:
输出N行,每行一个正整数,第i行整数表示当X=i时,阿明最多积累的疲劳值。
【数据说明】
对于20%的数据,1≤N≤20;
对于40%的数据,1≤N≤100;
对于60%的数据,1≤N≤1000;
对于100%的数据,1≤N≤1000000。
NOIP之前一直以为NOIP不会考线段树(其实真的没考,这题正解是贪心但是我不会%%%),所以写T4的时候打完暴力根本就没想到写线段树。暴力思路为一重循环枚举推销多少家,第二重循环找出消耗疲劳值最大的,然后改为0,输出答案,效率O(n^2)。
暴力代码如下:
var
len,tired:array[..]of longint;
n,i,j,max,s,ans,now,t,sum:longint; begin
readln(n);
for i:= to n do read(len[i]);
for i:= to n do read(tired[i]);
ans:=;
max:=;
for i:= to n do
begin
max:=-maxlongint;
for j:= to n do
begin
if j>now then s:=(*len[j])-(*sum)+tired[j]
else s:=tired[j];
if s>max then
begin
t:=j;
max:=s;
end;
end;
if t>now then
begin
now:=t;
sum:=len[now];
end;
len[t]:=;tired[t]:=;
inc(ans,max);
writeln(ans);
end;
end.
然后我们可以发现我们找最大值效率是O(n),那我们就用线段树来维护最大值就行了,效率O(log(n)),则总时间效率为O(nlog(n))。
这里简单说一下思路。建两棵线段树,对于现在走到的点,一棵维护左边的疲劳值最大值,也就是只需要维护推销的疲劳值最大值,一棵维护右边的疲劳值最大值,需要维护推销的疲劳值+走路的疲劳值。
代码如下(3kb):
type
point=record
max,delta,l,r,num:longint;
end;
var
len,tired:array[..]of int64;
i,j:longint;
n,max,ans,now,tt,t1,t2,max2,l,x,y:int64;
a:array[..,..]of point; procedure insert(x,num,delta,t:longint);
begin
if a[x,t].l=a[x,t].r then a[x,t].max:=
else
begin
if num<=(a[x,t].l+a[x,t].r)>> then insert(*x,num,delta,t);
if num>(a[x,t].l+a[x,t].r)>> then insert(*x+,num,delta,t);
if a[*x,t].max>a[*x+,t].max then
begin
a[x,t].max:=a[*x,t].max;
a[x,t].num:=a[*x,t].num;
end
else
begin
a[x,t].max:=a[*x+,t].max;
a[x,t].num:=a[*x+,t].num;
end;
end;
end; procedure build(x,l,r,t:longint);
begin
a[x,t].l:=l;a[x,t].r:=r;
if l=r then
begin
a[x,t].num:=l;
read(a[x,t].max);
a[x,t].delta:=;
if t= then len[l]:=a[x,t].max;
if t= then tired[l]:=a[x,t].max;
end
else
begin
build(*x,l,(l+r)>>,t);
build(*x+,((l+r)>>)+,r,t);
if a[*x,t].max>a[*x+,t].max then
begin
a[x,t].max:=a[*x,t].max;
a[x,t].num:=a[*x,t].num;
end
else
begin
a[x,t].max:=a[*x+,t].max;
a[x,t].num:=a[*x+,t].num;
end;
a[x,t].delta:=;
end;
end; procedure update(x,l,r,delta,t:longint);
begin
if (l<=a[x,t].l)and(a[x,t].r<=r) then
inc(a[x,t].delta,delta)
else
begin
if l<=(a[x,t].l+a[x,t].r)>> then update(*x,l,r,delta,t);
if r>(a[x,t].l+a[x,t].r)>> then update(*x+,l,r,delta,t);
if a[*x,t].max+a[*x,t].delta>a[*x+,t].max+a[*x+,t].delta then
begin
a[x,t].max:=a[*x,t].max+a[*x,t].delta;
a[x,t].num:=a[*x,t].num;
end
else
begin
a[x,t].max:=a[*x+,t].max+a[*x+,t].delta;
a[x,t].num:=a[*x+,t].num;
end;
end;
end; function query(x,l,r,h,t:longint):int64;
var
ret:int64;
begin
ret:=;
if (l<=a[x,t].l)and(a[x,t].r<=r) then
begin
ret:=a[x,t].max+a[x,t].delta;
if ret>=h then
tt:=a[x,t].num;
end
else
begin
inc(a[*x,t].delta,a[x,t].delta);
inc(a[*x+,t].delta,a[x,t].delta);
inc(a[x,t].max,a[x,t].delta);
a[x,t].delta:=;
if l<=(a[x,t].l+a[x,t].r)>> then ret:=query(*x,l,r,h,t);
if r>(a[x,t].l+a[x,t].r)>> then
if ret<query(*x+,l,r,ret,t) then ret:=query(*x+,l,r,ret,t);
end;
query:=ret;
end; begin
readln(n);
build(,,n,);
build(,,n,);
for i:= to n do update(,i,i,len[i]+tired[i],);
ans:=;
max:=;
tt:=;
for i:= to n do
begin
max:=-maxlongint;
if now> then max:=query(,,now,,);
t1:=tt;
max2:=-maxlongint;
if now<n then max2:=query(,now,n,,);
if max<max2 then
begin
max:=max2;
t1:=tt;
end;
if t1>now then
begin
update(,t1,n,-*len[t1],);
insert(,t1,,);
now:=t1;
end;
insert(,t1,,);
inc(ans,max);
writeln(ans);
end;
end.
以下为官方数据情况:
NOIP2015普及组T4推销员(暴力+线段树)的更多相关文章
- 【NOIP2015普及组】 推销员(纪中数据-标准)
题目 [题目描述] 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 ...
- 【NOIP2015普及组】推销员_详解
题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...
- NOIP2015普及组总结
NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...
- NOIP2004普及组第3题 FBI树
/* 1106: NOIP2004普及组第3题 FBI树 时间限制: 1 Sec 内存限制: 128 MB 提交: 10 解决: 9 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 我 ...
- [NOIP2015 普及组] 扫雷游戏
[NOIP2015 普及组] 扫雷游戏 难度:入门 题目描述 扫雷游戏是一款十分经典的单机小游戏.在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开 ...
- NOIP2015普及组第四题推销员
好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...
- hdu 5475 An easy problem(暴力 || 线段树区间单点更新)
http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description The inve ...
- HDU 3974 Assign the task 暴力/线段树
题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
随机推荐
- MySQL高性能优化实战总结
1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...
- 从零开始的Python学习Episode 10——函数
函数 一.函数的创建 简单格式 def function_name(参数表): 函数体 return 如果没有写return,函数会默认返回一个none 二.函数的参数 必需参数: 调用函数时必需参数 ...
- sqli-labs学习笔记 DAY1
DAY 1 准备工作 安装phpstudy 安装配置sqli-labs 学习笔记 SQL语句的注释:–, # +在URL经过编码后会编码为空格 SQL语句的查询语句:SELECT column_nam ...
- Focalprice李培亮:梦想让人在我店里排队
[亿邦动力网讯]4月3日消息,外贸B2C平台Focalprice总裁李培亮日前亮相亿邦动力网联合河南省商务厅举办的“第九届中国中小企业电子商务大会暨2014中国(河南)跨境贸易电子商务峰会”,表达自己 ...
- Centos7 Zabbix监控部署
Zabbix监控 官方文档 https://www.zabbix.com/documentation/3.4/zh/manual https://www.zabbix.com/documentatio ...
- php命名空间学习笔记。
为什么要用命名空间? 在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: 用户编写的代码 与 PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲 ...
- 4. 基本socket函数
一.创建socket /* 创建一个socket */ int socket(int family, int type, int protocol); /* 参数说明 */ // domain:使用哪 ...
- Beautiful Year(拆分四位数)
Description It seems like the year of 2013 came only yesterday. Do you know a curious fact? The year ...
- 对石家庄铁道大学网站UI的分析
作为我们团队的PM,老师对我们提出了一些额外的要求,所以我发表这篇博客来谈一下对石家庄铁道大学网站UI的分析. 首先,PM 对项目所有功能的把握, 特别是UI.最差的UI, 体现了 ...
- 第一次c++团队合作作业期间第一篇随笔
分析了自己分到的任务,我的理解是这样的:首先要生成程序主框架,在主框架中进行地图的描绘.我应该是先进行地图的拼接,把建筑物和地面都拼接好.然后再在地图上显示出英雄和小兵.同时还要在主框架中分析了自己分 ...