题目描述 Description

阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有N家住户,第i家住户到入口的距离为Si米。由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等。阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去。阿明每走1米就会积累1点疲劳值,向第i家住户推销产品会积累Ai点疲劳值。阿明是工作狂,他想知道,对于不同的X,在不走多余的路的前提下,他最多可以积累多少点疲劳值。

输入描述 Input Description

第一行有一个正整数N,表示螺丝街住户的数量。
接下来的一行有N个正整数,其中第i个整数Si表示第i家住户到入口的距离。数据保证S1≤S2≤…≤Sn<10^8。
接下来的一行有N个正整数,其中第i个整数Ai表示向第i户住户推销产品会积累的疲劳值。数据保证Ai<10^3。

输出描述 Output Description

输出N行,每行一个正整数,第i行整数表示当X=i时,阿明最多积累的疲劳值。

样例输入 Sample Input

【样例1】
5
1 2 3 4 5
1 2 3 4 5

【样例2】
5
1 2 2 4 5
5 4 3 4 1

样例输出 Sample Output

【样例1】
15
19
22
24
25

【样例2】
12
17
21
24
27

数据范围及提示 Data Size & Hint

1≤N≤100000
注:请用 scanf 输入。

/*
刚开始想了一个贪心思路,不知道对不对,然而真的就对了,只不过是O(n^2)的,TLE,
然后用优先队列优化就过了。
贪心思路首先我们明确,找前i个住户一定是在i-1的基础上找的,具体方法是记录当前我们
最远找到的村庄位置now,因为当你往回找和往前找时走的路程是不同的,对于now来说,
我们有两种决策,一种是向上找,一种是向下找,找到最大值加入ans,这样是O(n^2)的方法。
然而我们发现向上找的部分会随now的变大而逐渐不浪费时间,向下找的部分则会重复找很多次,
所以我们搞一个优先队列,再记录一个当前最远的入队元素位置from,每次当我们更新now时,
就把from+1到now内的元素放入优先队列,这样我们在下一次向下找的时候就不用再循环一遍,
而是直接从优先队列中取头元素就好了。
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#define M 100010
using namespace std;
int n,ans;
struct node
{
int v,pos;
bool operator< (node x)const
{
return v<x.v;
}
};node a[M],b;
priority_queue<node> q;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i].pos);
for(int i=;i<=n;i++)
scanf("%d",&a[i].v);
b.v=;b.pos=;
q.push(b);
int now=,from;
for(int i=;i<=n;i++)
{
b=q.top();
int mx=b.v,p=;
for(int j=now+;j<=n;j++)
if((a[j].pos-a[now].pos)*+a[j].v>mx)
{
mx=(a[j].pos-a[now].pos)*+a[j].v;
p=j;
}
if(p)
{
b.pos=p;b.v=mx;
from=now;now=p;
q.push(b);
for(int j=from+;j<now;j++)
q.push(a[j]);
}
node b=q.top();
ans+=b.v;
q.pop();
printf("%d\n",ans);
}
return ;
}

推销员(codevs 5126)的更多相关文章

  1. Codevs 5126 推销员 2015年NOIP全国联赛普及组

    5126 推销员 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死 ...

  2. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  5. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  6. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  7. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

  8. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  9. codevs 1052 地鼠游戏

    1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...

随机推荐

  1. 微信扫码下载APK遮罩提示示例

    由于微信的限制,应用文件在内置浏览器中下载全部被屏蔽掉,造成很多人用微信扫描二维码下载时,界面显示一片空白,容易误导以为在下载呢.按照当前主流习惯,做一个提示用户在浏览器中打开下载的遮罩.网上很多现成 ...

  2. c++ rand && srand 函数

    RAND: 结构:rand()     注:rand()不需要参数,它会根据种子返回一个从0到最大随机数的任意整数. 作用:生成一个随机数. 头文件:#include <cstdlib> ...

  3. JS数组、outerHtml、className

    //对象转换为数组function obj(){for(var i=0;i<arguments.length;i++){ this[i]=arguments[i]; }} var o2=new ...

  4. sublime 自定义快捷键

    [ { "keys": ["alt+space"], "command": "auto_complete" }, // ...

  5. springboot项目中,@transactional 无效

    问题: springboot项目,依然是使用jpa.Hibernate来操作mysql,涉及到数据库的操作,就少不了事务.写了一个接口,用来测试@Transaction注解的作用,发现没有效果 分析: ...

  6. [算法天天练] - C语言实现双向链表(一)

    双向链表是比较常见的,主要是在链表的基础上添加prev指针,闲话少说直接上代码吧(这个也是网上一个大神的思路,真心不错,条理清楚,逻辑缜密) 主要也是为了学习,贴上我所调试成功的代码(Linux环境下 ...

  7. 【译】x86程序员手册29-第8章 输入输出

    Chapter 8 Input/Output 输入/输出 This chapter presents the I/O features of the 80386 from the following ...

  8. JSP参数传递兼EL表达式

    1.浏览器?方式传递参数 /** 浏览器地址栏输入?方式传递参数 ?test=123 */ 可以用${param.test}方式输出 2.页面内部设置参数setAttribute /** JSP页面中 ...

  9. JavaScript中的方法

    JavaScript中的方法 在JavaScript中,可以通过对象来调用对应的方法.在JavaScript中,有三个重要的window对象方法:用于显示警告信息的alert.用于显示确认信息的con ...

  10. 用Docker构建MySQL镜像

    构建MySQL镜像 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过D ...