……普及组的题目都做不出来……(;´д`)ゞ……再这样下去要退役了啊……

  不过不管怎样感觉这题还是蛮好的,也要记录一下下~

  我们注意到数据的范围,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推销员的更多相关文章

  1. [NOIP2015]推销员

    [NOIP2015]推销员 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住 ...

  2. 题解 [NOIP2015]运输计划

    题解 [NOIP2015]运输计划 题面 解析 首先肯定是要求出每条路径的长度. 这个用节点到根的前缀和就行了(一开始脑抽写了个线段树...) 然后有一个显然的类似贪心的想法, 就是你改造的边肯定在最 ...

  3. 运输计划(题解)(Noip2015)

    运输计划(题解)(Noip2015) 二分答案+树上差分 树上差分其实不难,只是名字高大尚,可以学一下:Eternal风度的树上差分 本人博客里也总结了一些其他的知识供大家学习:Eternal风度的博 ...

  4. NOIP 2015 推销员

    洛谷 P2672 推销员 洛谷传送门 JDOJ 2994: [NOIP2015]推销员 T4 JDOJ传送门 Description 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死 ...

  5. $NOIp$普及组做题记录

    \([NOIp2014]\) 螺旋矩阵 \(Sol\) 直接模拟,一次走一整行或者一整列.复杂度\(O(n)\). \(Code\) #include<bits/stdc++.h> #de ...

  6. NOIP2016考前做题(口胡)记录

    NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...

  7. NOIP2015 T4 推销员 贪心+堆优化

    前几天在学堆,这个数据结构貌似挺简单的,但是我看了很久啊QAQ... 今天算是搞懂了吧...于是想到了这道题...(当初悄悄咪咪看题解记得一点) 点我看题 放洛谷的题... 题意的话,大概就是有n个房 ...

  8. 【题解】NOIP2015提高组 复赛

    [题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...

  9. 【NOIP2015普及组】 推销员(纪中数据-标准)

    题目 [题目描述] 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 ...

随机推荐

  1. 12 垃圾回收GC

    1.垃圾回收 1.) 小整数对象池    #提前建立好的 Python 对小整数的定义是 [-5, 257) 这些整数对象是提前建立好的,不会被垃圾回收.在一个 Python 的程序中,所有位于这个范 ...

  2. Ubentu编译Android源码(AOSP)

    前言: 一直想要编译一下Android 源码,之前去google 看,下载要下载repo. 当时很懵逼,repo 是个什么?(repo 是一个python 脚本,因为Android 源码git 仓库太 ...

  3. 【白书训练指南】(UVa10755)Garbage Heap

    先po代码,之后把我那几个不太明了的知识点讲讲,巩固以下.三维的扫描线算法想要掌握还真是有一定的难度的. 代码 #include <iostream> #include <cstri ...

  4. php常用几个数组的区别

    本文主要介绍的php数组函数主要有:sort.rsort.asort.arsort.ksort.krsort 测试数据定义一个关联数组如下: $data=[ 'f'=>123, 'b'=> ...

  5. php单例模式和工厂模式

    单例模式:防止重复实例化,避免大量的new操作,减少消耗系统和内存的资源,使得有且仅有一个实例对象 header("Content-type: text/html; charset=utf- ...

  6. JEMTER简单的测试计划

    测试计划一 1)测试网站:http://www.geneedu.cn/和http://supu01.1688.com/ 2)测试目的是该网站在负载达到20 QPS 时的响应时间. 备注: QPS : ...

  7. 消费者用nginx做负载均衡,提供者用zookeeper自带功能实现负载均衡

    公司的项目基于阿里的Dubbo微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现Dubbo的分布式服务 ...

  8. 深入理解java虚拟机学习笔记(二)

    第三章 垃圾收集器与内存分配策略 概述 ​ 程序计数器.虚拟机栈.本地方法栈3个区随线程而生,随线程而灭.因此大体上可认为这几个区域的内存分配和回收都具备确定性.在方法/线程结束时,内存自然就跟着回收 ...

  9. ionic ios样式偏移解决方案。

    在css属性内增加: .item-ios [item-end] { //解决ios系统上尾部图标出现重影而增加的格式. margin: 0px -15.3px 0px 0px; margin-bott ...

  10. 使用手机登录OWA修改密码的问题

    最近发现使用手机端登录OWA,安卓手机是可以修改密码的,如图1,但是iPhone就不成,safari和第三方都不可以,如图二. 图一 图二