【题解】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 家住户到入口的距离为 ...
随机推荐
- Ubuntu配置IP
Ubuntu网络配置的常用系统,于是我学习研究了Ubuntu网络配置,在这里对大家详细介绍下Ubuntu网络配置应用,希望对大家有用Ubuntu网络配置包含了非常好的翻译和容易使用的架构./etc/n ...
- Consul 简介
Consul包含很多组件,总体来数,Consul是一种服务发现和配置工具. 服务发现:一个客户端提供自己的服务,例如api服务,或者mysql服务,另一个客户端就可以利用Consul通过DNS或者ht ...
- 微服务框架Dubbo与Springcloud的区别
微服务框架Dubbo与Springcloud的区别 微服务主要的优势如下: 1.降低复杂度 将原来偶合在一起的复杂业务拆分为单个服务,规避了原本复杂度无止境的积累.每一个微服务专注于单一功能,并通过定 ...
- git revert 与 git reset
Git版本回滚之 git revert 与 git reset 在使用 git 的时候,如果错误push之后,经常会回滚版本. git的回滚有两种方式: revert命令:这种方式,是用一种反向的 p ...
- HashMap 阅读
最近研究了一下java中比较常见的map类型,主要有HashMap,HashTable,LinkedHashMap和concurrentHashMap.这几种map有各自的特性和适用场景.使用方法的话 ...
- [CH0304]IncDec Sequence
和NOIP2018DAY1T1类似的题目,但思维难度高多了. 这题既可以抬高路面,也可以降低路面,而且目标平面不确定,就难起来了. 但是两道题的基本思路几乎一样,同样我们将 2~n 的高度差分,1之所 ...
- python读取日志,存入mysql
1.从 http://www.almhuette-raith.at/apache-log/access.log 下载 1万条日志记录,保存为一个文件,读取文件并解析日志,从日志中提取ip, time_ ...
- [转载] RCNN/SPP/FAST RCNN/FASTER RCNN/YOLO/SSD算法简介
RCNN: RCNN(Regions with CNN features)是将CNN方法应用到目标检测问题上的一个里程碑,由年轻有为的RBG大神提出,借助CNN良好的特征提取和分类性能,通过Regio ...
- [C++] Variables and Basic Types
Getting Started compile C++ program source $ g++ -o prog grog1.cc run C++ program $ ./prog The libra ...
- NFC学习总结
NFC 学习总结 1.NFC 的基本概念 NFC 是 Near FieldCommunication 的缩写,即距离无线通信技术.由飞利浦公司和索尼公司共同开发的NFC 是一种非接触式识别和互联技术, ...