[NOIP2015]推销员

试题描述

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

输入

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

输出

输出 N 行,每行一个正整数,其中第 i 行整数表示当 x=i,阿明积累的疲劳值。

输入示例

5
1 2 3 4 5
1 2 3 4 5

输出示例

15
19
22
24
25

数据规模及约定

1<= N <= 1000000

题解

NOIP普及组也有尊严!

不难想到 X= i 时的最优方案一定从 X = i-1 时的最优方案的基础上再加一户宣传对象得来。

考虑 X = 1 时的选择,显然是所有住户中 Ai + 2Si 中最大的被选,若有多个住户的 Ai + 2Si 相同,则优先选择 Si 最小的(想一想为什么)。

然后序列被划分成左右两个部分,选择左边住户获得 Ai 的贡献,选择右边住户获得 Ai + 2(Si - T) 的贡献,T 表示当前划分界限到胡同入口的距离,注意右边部分的贡献的大小关系相比最初并没有改变,只需要重新对左边住户的贡献进行排序。于是可以建一个新优先队列将左边的所有住户加入,将原优先队列中被划分到左边部分的元素丢掉。因为划分界线是一直往右移的,所以每个元素至多被加入两次,被删除两次,总时间复杂度为O(nlogn).

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;

const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
    if(Head == Tail) {
        int l = fread(buffer, 1, BufferSize, stdin);
        Tail = (Head = buffer) + l;
    }
    return *Head++;
}
int read() {
    int x = 0, f = 1; char tc = getchar();
    while(!isdigit(tc)){ if(tc == ‘-‘) f = -1; tc = getchar(); }
    while(isdigit(tc)){ x = x * 10 + tc - ‘0‘; tc = getchar(); }
    return x * f;
}

#define maxn 1000010
#define LL long long
int n, S[maxn], A[maxn];
bool has[maxn];
struct HeapNode {
	int id, x;
	LL val;
	bool operator < (const HeapNode& t) const { return val != t.val ? val < t.val : x > t.x; }
} ;
HeapNode Max(HeapNode a, HeapNode b) {
	if(a < b) return b;
	return a;
}
priority_queue <HeapNode> Q, Q2;

int main() {
	n = read();
	for(int i = 1; i <= n; i++) S[i] = read();
	for(int i = 1; i <= n; i++) A[i] = read();

	while(!Q.empty()) Q.pop();
	while(!Q2.empty()) Q2.pop();
	for(int i = 1; i <= n; i++) Q.push((HeapNode){ i, S[i], (LL)A[i] + 2ll * S[i] });
	int T = 0, Tid = 0; LL ans = 0;
	for(int i = 1; i <= n; i++) {
		HeapNode u; u = (HeapNode){ 0, 0, 0 };
		if(!Q.empty()) {
			u = Q.top(); Q.pop();
			while(u.x <= T && !Q.empty()) u = Q.top(), Q.pop();
			if(u.x > T && Q.empty()) u = (HeapNode){ 0, 0, 0 };
			else u.val -= 2ll * T;
		}
		HeapNode v; v = (HeapNode){ 0, 0, 0 };
		if(!Q2.empty()) v = Q2.top(), Q2.pop();
		u = Max(u, v); has[u.id] = 1;
		ans += u.val;
		printf("%lld\n", ans);
		if(u.x > T) {
			T = u.x;
			for(++Tid; Tid <= n && S[Tid] <= T; Tid++) if(!has[Tid])
				Q2.push((HeapNode){ Tid, S[Tid], A[Tid] });
		}
	}

	return 0;
}
时间: 2025-01-07 13:48:37

[NOIP2015]推销员的相关文章

noip2015普及组 推销员

5126 推销员 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为Si米.由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等.阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去.阿明每走1米就会积累1点疲劳值,向第i家住户推销产品

[NOIP2015] 跳石头

2107. [NOIP2015] 跳石头 ★   输入文件:2015stone.in   输出文件:2015stone.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选 择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点. 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛

树链剖分-Hello!链剖-[NOIP2015]运输计划-[填坑]

This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://www.cnblogs.com/JasonCow/ [NOIP2015]运输计划    Hello!链剖.你好吗? 题意: 给出一棵n个节点的带权树,m对树上点对 现在允许删除一条边,(权值修改为0) 输出: 最小化的点对间最大距离 1.链剖 2.树上差分 3.二分 链剖我就不多说了,就是两dfs 注意

Openjudge NOI题库 ch0111/10 河中跳房子|NOIP2015 day2 stone

这题同时也是NOIP2015 D2T1 跳石头 stone 原题. 总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石.在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L). 在比赛过程中,奶牛轮流从起点

[NOIP2015]信息传递

[NOIP2015]信息传递[问题描述]有??个同学(编号为1到??)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为?? 的同学的信息传递对象是编号为????的同学.游戏开始时,每人都只知道自己的生日.之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象).当有人从别人口中得知自己的生日时,游戏结束.请问该游戏一共可以进行几轮?[输入格式]输入文件名为m

BZOJ 4326:NOIP2015 运输计划(二分+差分+lca)

NOIP2015 运输计划Description公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去.显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之间不会产生任何干扰.为了鼓励科技创新, L

NOIP2015 运输计划(二分+LCA+差分)

4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 208[Submit][Status][Discuss] Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui

NOIP2015总结

  Noip2015提高组总结 Noip2015如风般就过去(风一样的美男子),只留下我们在那里暗自神伤. Day0 坐在车上,看着外面的风景,一想到明天就要被屠宰,我的心情是崩溃的.但幸好,车上有位师兄(代号:红薯)开了热点,我的心情向好的方向前进了一大半(他的流量也用去了一大半). 到了之后,欢乐时间(开房时间)就来了,我们打打uno,下下飞行棋,很快时间就到了11点多,然后我就和XWZ洗洗睡了(超刺激). Day1 然后我就要进入屠宰场了,有两位貌似是中大集训队的师姐来监考,我感觉像是喝醉

【NOIP2015】斗地主

P2431 - [NOIP2015]斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种 使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如 下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响.每一局游戏中,一副手牌由n张牌组成.游戏者每 次可以根据规定的牌型进行出牌,首先打光自