推(chuan)销员

分析

这里主要阐述一下我的分析思路。

看起来挺直观的。

最初的想法,我们枚举每一个最远点mxp的位置,然后对之前的a进行排序。

那么以mxp为最远点,选x个的最大疲劳值为:



这样的复杂度为,考试时就这样拿了个60pt。

但是,我们要尝试发现这道题的特性,来进行时间上的优化。

根据极大化思想,我们要尽可能排除不影响答案的。

当一定时,设,没有优,这等价于:







当增大的时候,例如变大到,发现的值一定是递增的,因为一定是多一个数,也一样,而能选择到的也能选择得到。

所以我们得到了决策单调性:对于,,没有优,那么随着的增大,仍然没有优,所以对于的询问的决策点会非严格单调递增。

接下来,很容易想到用单调队列什么的进行维护。

但怎么尝试都觉得不行……

这时候就一定要跳出来啦。

根据决策单调性这个重要的特点,考虑换一种思考的角度。

假如当前这个询问我们决策点为,答案为,现在要求这个询问的决策点和答案。

我们有两种方法:

①在之前选择一个没有选择过的点,

②在之后选择一个决策点,

用两个堆实现即可。

有点意思。

代码

#include <cstdio>
#include <cctype>
#include <queue>
using namespace std;

#define rep(i,a,b) for (int i=(a);i<=(b);i++)

#define x first
#define y second
#define mp make_pair

typedef pair<int,int> PII;

const int N=131072;

int n;
int s[N],a[N];

int cur,vis[N];
priority_queue<PII> qs,qb;
int res;

inline int rd(void)
{
    int x=0,f=1; char c=getchar();
    for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
    for (;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}

int main(void)
{
//  freopen("a.in","r",stdin);
//  freopen("a.out","w",stdout);

    n=rd();
    rep(i,1,n) s[i]=rd();
    rep(i,1,n) a[i]=rd();

    rep(i,1,n)
        qb.push(mp(2*s[i]+a[i],i));

    PII t1,t2; int e1,e2,cs;
    rep(i,1,n)
    {
        while (!qs.empty())
        {
            t1=qs.top();
            if (vis[t1.y])
                qs.pop();
            else break;
        }
        while (!qb.empty())
        {
            t2=qb.top();
            if (t2.y<cur||vis[t2.y])
                qb.pop();
            else break;
        }

        e1=(!qs.empty());
        e2=(!qb.empty());
        if (!e1&&e2)
            cs=2;
        else if (e1&&!e2)
            cs=1;
        else if (e1&&e2)
        {
            t1=qs.top(),t2=qb.top();
            if (t2.x-2*s[cur]>=t1.x)
                cs=2;
            else cs=1;
        }

        if (cs==1)
        {
            t1=qs.top(); qs.pop();
            vis[t1.y]=1;
            res+=t1.x;
        }
        else if (cs==2)
        {
            t2=qb.top(); qb.pop();
            vis[t2.y]=1;
            rep(j,cur+1,t2.y)
                if (!vis[j])
                    qs.push(mp(a[j],j));
            res+=(t2.x-2*s[cur]);
            cur=t2.y;
        }

        printf("%d\n",res);
    }

    return 0;
}

【NOIP2015】推销员的更多相关文章

  1. [NOIP2015]推销员

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

  2. 【题解】NOIP2015推销员

    ……普及组的题目都做不出来……(:´д`)ゞ……再这样下去要退役了啊…… 不过不管怎样感觉这题还是蛮好的,也要记录一下下~ 我们注意到数据的范围,n 是 1e5, 又有 1e5组询问,暴力大概是 \( ...

  3. NOIP 2015 推销员

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

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

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

  5. NOIP2015普及组第四题推销员

    好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...

  6. 【NOIP2015普及组】推销员_详解

    题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...

  7. NOIP2015普及组T4推销员(暴力+线段树)

    题目:阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为Si米.由于同一栋房子里 ...

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

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

  9. [NOIP2015普及组]推销员

    题目:洛谷P2672.codevs5126.Vijos P1977 题目大意:有个推销员要去推销,要你求他推销1~n户人家分别最多花多少“疲劳值”.具体见题目. 解题思路:如果用$O(n^2)$做的话 ...

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

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

随机推荐

  1. IOSView显示特性设置

    一.主要用途 弹出模态ViewController是IOS变成中很有用的一个技术,UIKit提供的一些专门用于模态显示的ViewController,如UIImagePickerController等 ...

  2. Python 2.7.9 Demo - 获取调用的参数

    #coding=utf-8 #!/usr/bin/python import sys; print("The command line parameters are : "); f ...

  3. 改变HTML

    改变HTML 1.改变HTML输出流 JavaScript可以创建动态的HTML内容.(注意:不要在加载文档后使用document.write(),这会覆盖文档.) <%@ page langu ...

  4. php获取汉字的拼音 拼音首字母

    /***获取汉字的拼音*/function pinyin($s, $isfirst = false) { static $pinyins; $s = trim($s); $len = strlen($ ...

  5. SQL查看一张表中是否存在记录

    今天在QQ群众讨论到一个问题,记录下下来,一边以后用的时候可以翻阅 总结除了三种方法 --方法1,,这一种方法不行,,错误的认识了,@@ROWCOUNT,,,唉,,学艺不精,,丢人啊 SELECT T ...

  6. PHP中的替代语法(冒号、endif、endwhile、endfor)

    我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: <?php if(empty($GET_['a'])): ?> <font color=" ...

  7. MyBatis 多表联合查询及优化 以及自定义返回结果集

    下面就来说一下 mybatis 是通过什么来实现多表联合查询的.首先看一下表关系,如图: 这 里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了 ...

  8. [转老马的文章]MODI中的OCR模块

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2012.07.02更新:2012.07.09补充非简体中文版内容 自从基于MODI的DjVuToy.FreePic2Pdf. ...

  9. Oracle ——————建表、select、视图

    --建表 -- 关键字 : create -- 用法 : /* create table table_name ( lie1_name 数据类型 是否为空, lie2_name 数据类型 是否为空, ...

  10. FLASH CC 2015 CANVAS (四)制作响应式设计(自适应)的项目

    注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误(如果发现我会更新文章)! 正式教程会在后续开始更新 相信你在看了(第二节)(第三节)之后已经能够满足绝大多数的互动需求了.那么也 ...