题目描述 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. php使用邮箱发送验证码

    如果看着文字眼乏就去看看视频吧-> 如何注册腾讯企业邮箱 https://www.bilibili.com/video/av14351397/ 如何在项目中使用 https://www.bili ...

  2. FFT学习及简单应用(一点点详细)

    什么是FFT 既然打开了这篇博客,大家肯定都已经对FFT(Fast Fourier Transformation)有一点点了解了吧 FFT即为快速傅里叶变换,可以快速求卷积(当然不止这一些应用,但是我 ...

  3. [ USACO 2010 FEB ] Slowing Down

    \(\\\) \(Description\) 给出一棵 \(N\) 个点的树和 \(N\) 头牛,每头牛都要去往一个节点,且每头牛去往的点一定互不相同. 现在按顺序让每一头牛去往自己要去的节点,定义一 ...

  4. php域名授权只需要一个函数

    <?php function allow_doamin(){ $is_allow=false; $url=trim($_SERVER['SERVER_NAME']); $arr_allow_do ...

  5. Python学习日记之文件读取操作

    Python内置了文件读写的函数open,read 用法示例: open('/home/root/files.txt ') 在打开文件后,操作完成后可以使用close()关闭文件,但比较好的文件读写方 ...

  6. git分支拉取

    假设你已经配置好了各种SSH Key之类并熟悉基本的git创建分支.提交分支命令.比如共有2个分支,自己在一台未配置origin电脑上想要拉取某个分支(dev)到本地.步骤如下:1.新建git项目 与 ...

  7. java生成excel

    package test.poi; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; ...

  8. Spring scheduled cron 表达式

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数) 月(0~11) 天( ...

  9. Java基础(六)--枚举Enum

    枚举: 刚开始项目中没怎么用过,只知道能够实现作为项目中类似定义Constant的功能,然后知道枚举实现的单例模式几乎是最优雅的,所以, 想要深入完整的了解一下 1.基本特性: Enum.values ...

  10. 如何在MONO 3D寻找最短路路径

    前段时间有个客户说他们想在我们的3D的机房中找从A点到B点的最短路径,然而在2D中确实有很多成熟的寻路算法,其中A*是最为常见的,而这个Demo也是用的A*算法,以下计算的是从左上角到右下角的最短路径 ...