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

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

  我们注意到数据的范围,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. day 5 飞机发射子弹 难点??

    1.效果图 2.飞机发出子弹 #-*- coding:utf-8 -*- import pygame import time from pygame.locals import * class Her ...

  2. IAR环境下编译CC2640入门开发

    1. 安装SDK包,之后导入AIR里面,编译报错 看样子似乎是xdc工具的路径配置不对,进入路径配置对话窗 开始配置 配置完之后,重新编译 Fatal Error[Pe1696]: cannot op ...

  3. 机器学习的5种“兵法"

    大数据文摘作品,欢迎个人转发朋友圈,自媒体.媒体.机构转载务必申请授权,后台留言“机构名称+转载”,申请过授权的不必再次申请,只要按约定转载即可. 作者:Jason Brownlee 译者:Clair ...

  4. java对于Redis中jedis的操作

    package com.answer.redis; import java.util.HashMap; import java.util.List; import java.util.Map; imp ...

  5. 开发发布npm module包

    开发发布npm module包 问题 在项目开发过程中,每当进入一个新的业务项目,从零开始搭建一套前端项目结构是一件让人头疼的事情,就要重新复制一个上一个项目的前端框架和组件代码库.其中很多功能的模块 ...

  6. pygame安装【在pycharm的IDE project下】

    pygame安装[在pycharm的IDE project下] 首先更新电脑的pip.exe[命令行下面] 然后进入IDE project ——>setting 中查找是否安装pygame 我的 ...

  7. Selenium 入门到精通系列:五

    Selenium 入门到精通系列 PS:显式等待.隐式等待.强制等待方法 例子 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019 ...

  8. unity初探之黑暗之光(2)

    unity初探之黑暗之光(2) 一.设置角色跟随鼠标点击移动 思路:使用charactercollider的SimpleMove方法来控制角色的移动.通过摄像机的射线投射到地面,通过屏幕上的一个点也就 ...

  9. Java异常处理介绍(Java知识的重点内容)

    Java 异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你 ...

  10. HDU 1232 并查集板子题

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...