【题解】NOIP2015推销员
……普及组的题目都做不出来……(;´д`)ゞ……再这样下去要退役了啊……
不过不管怎样感觉这题还是蛮好的,也要记录一下下~
我们注意到数据的范围,n 是 1e5, 又有 1e5组询问,暴力大概是 \(n^{2}logn\) 的吧。这个数据范围提示我们处理一组询问的复杂度应该要控制在 \(logn\) 的范围内,所以联想到前一问的答案应该会对后面的答案产生贡献。
于是贪心。如果在当前已经确定了 \(x\) 个推销的地方,考虑第 \(x + 1\) 个究竟应该放在哪里。如果在到达的最远的地方的右方,疲惫值增加 \(a[i] + 2 * S[i] - S[last]\) ,如果在前方,增加 \(a[i]\) 。这样就可以每次增加一个元素,求出所需答案了。可以使用线段树来维护:
对我知道有更简短的,可我就是喜欢线段树怎么着?
#include <bits/stdc++.h>
using namespace std;
#define maxn 100000
int n, a[maxn], S[maxn];
int ans, last; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} struct node
{
int id, sum;
node(int x = , int y = ) { id = x, sum = y; }
friend bool operator <(const node& a, const node& b)
{
if(a.sum != b.sum) return a.sum < b.sum;
return a.id < b.id;
}
}; struct Segament_Tree
{
node T[maxn * ];
void build(int u, int l, int r, int opt)
{
if(l == r)
{
T[u].id = l, T[u].sum = opt ? a[l] : * S[l] + a[l];
return;
}
int mid = (l + r) >> ;
build(u << , l, mid, opt); build(u << | , mid + , r, opt);
T[u] = max(T[u << ], T[u << | ]);
} void clear(int u, int l, int r, int x)
{
int mid = (l + r) >> ;
if(l == r)
{
T[u] = node(, );
return;
}
if(x <= mid) clear(u << , l, mid, x);
else clear(u << | , mid + , r, x);
T[u] = max(T[u << ], T[u << | ]);
} node Query(int u, int l, int r, int L, int R)
{
if(L > R) return node(, );
int mid = (l + r) >> ;
if(L > r || R < l) return node(, );
if(L <= l && R >= r) return T[u];
return max(Query(u << , l, mid, L, R), Query(u << | , mid + , r, L, R));
}
}T1, T2; int main()
{
n = read();
for(int i = ; i <= n; i ++) S[i] = read();
for(int i = ; i <= n; i ++) a[i] = read();
T1.build(, , n, ), T2.build(, , n, );
node P = T2.Query(, , n, , n); last = P.id;
T1.clear(, , n, last), T2.clear(, , n, last);
printf("%d\n", ans = P.sum);
for(int i = ; i <= n; i ++)
{
node t1 = T1.Query(, , n, , last - );
node t2 = T2.Query(, , n, last + , n);
t2.sum -= * S[last];
node t3 = max(t1, t2);
if(t1 < t2) last = t3.id, T1.clear(, , n, last), T2.clear(, , n, last);
else T1.clear(, , n, t3.id), T2.clear(, , n, last);
printf("%d\n", ans += t3.sum);
}
return ;
}
【题解】NOIP2015推销员的更多相关文章
- [NOIP2015]推销员
[NOIP2015]推销员 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住 ...
- 题解 [NOIP2015]运输计划
题解 [NOIP2015]运输计划 题面 解析 首先肯定是要求出每条路径的长度. 这个用节点到根的前缀和就行了(一开始脑抽写了个线段树...) 然后有一个显然的类似贪心的想法, 就是你改造的边肯定在最 ...
- 运输计划(题解)(Noip2015)
运输计划(题解)(Noip2015) 二分答案+树上差分 树上差分其实不难,只是名字高大尚,可以学一下:Eternal风度的树上差分 本人博客里也总结了一些其他的知识供大家学习:Eternal风度的博 ...
- NOIP 2015 推销员
洛谷 P2672 推销员 洛谷传送门 JDOJ 2994: [NOIP2015]推销员 T4 JDOJ传送门 Description 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死 ...
- $NOIp$普及组做题记录
\([NOIp2014]\) 螺旋矩阵 \(Sol\) 直接模拟,一次走一整行或者一整列.复杂度\(O(n)\). \(Code\) #include<bits/stdc++.h> #de ...
- NOIP2016考前做题(口胡)记录
NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...
- NOIP2015 T4 推销员 贪心+堆优化
前几天在学堆,这个数据结构貌似挺简单的,但是我看了很久啊QAQ... 今天算是搞懂了吧...于是想到了这道题...(当初悄悄咪咪看题解记得一点) 点我看题 放洛谷的题... 题意的话,大概就是有n个房 ...
- 【题解】NOIP2015提高组 复赛
[题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...
- 【NOIP2015普及组】 推销员(纪中数据-标准)
题目 [题目描述] 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 ...
随机推荐
- springBoot -webSocket 基于STOMP协议交互
浅谈WebSocket WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就可以建立一条快速通道,两者就可以实现数据互传了.说白了,就是打破了 ...
- Android性能优化来龙去脉总结
WeTest 导读 一款app除了要有令人惊叹的功能和令人发指交互之外,在性能上也应该追求丝滑的要求,这样才能更好地提高用户体验. 以下是本人在工作中对经历过的性能优化的一些总结,依据故事的发展路线, ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 – 员工离职管理
C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 – 员工离职管理 当公司有几万人,上千家加盟网点,几个庞大的直属分公司后,系统账户的有效管理也是一个头疼的问题,把所有的帐户及时进行科学 ...
- linux常用的命令之一chmod
用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(g ...
- 前端开发工程师 - 02.JavaScript程序设计 - 第2章.进阶篇
第2章--进阶篇 类型进阶 类型: Undefined Null Boolean String Number Object 原始类型(值类型):undefined, null, true, " ...
- go通过第三方库 mahonia gbk 转utf8
go get github.com/axgle/mahonia dec := mahonia.NewDecoder("GBK")ret:=dec.ConvertString(res ...
- Linux系统负载查询
查询Linux系统负载情况,一般需要了解三个方面的信息: 1.Linux系统配置.如Linux版本号.CPU.内存.网络.磁盘等: 2.收集系统负载信息的手段.常用的工具包有sysstat和procp ...
- Turtlebot
Turtlebot2 数据分析: imu信息:只有z轴的旋转yaw,没有xy的角速度. odom:利用轮速计,提供平移变换,没有z方向的平移. 好的网站,详细介绍了turtlebot的使用:https ...
- mouseover 和 mouseout 事件是可以冒泡的 取消
mouseover 和 mouseout 事件是可以冒泡的,子元素上触发的事件会冒泡到父元素上.可以改用 mouseleave 和 mouseenter 事件,这两个事件不冒泡.
- selenium识别登录验证码---基于python实现
本文主要是通过PIL+pytesseract+Tesseract-OCR实现验证码的识别 其中PIL为Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PI ...