题目描述


输入格式

第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离。接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的僵尸,排头僵尸从距离房子Xi米处开始接近。


输出格式

一个数,n关植物攻击力的最小总和 ,保留到整数。

数据范围及提示

对于100%的数据, 1≤n≤10^5,1≤d≤10^12,1≤x≤ 10^12,1≤a≤10^12


  • 题解:

    • 需要先分析一个是否合法的判定规则:
    • 由于一只僵尸被杀死后会立刻攻击后面的僵尸,所以只要对于每一个僵尸满足可以杀死即可;
    • 考虑到第$n$关,最小可防御的攻击力$y_{n}$即:$max \{  \frac{sum_{i}}{x+(i-1)d} \}: \ 1 \le i \le n \ $;
    • 所以求出每关最小的$y_{n}$加起来,考虑快速求每关的$y_{n}$;
    • 和题目中的加入顺序搭配一下即:$\frac{ sum_{n} - sum_{i-1} }{ x + (n-i)d }$;
    • 即:$\frac{sum_{n} - sum{i-1}}{ x + nd - id }: 1 \le i \le n $;
    • 可以看成定点$P(sum_{n},x+nd)$和点群$S:(sum_{i-1},id)$的斜率最大值;
    • 注意到$S_{n}$一定在$S_{i}:1 \le i \lt n$的右上方,同时$P$一定在当前$S$的右上方;
    • 所以对$S$维护一个下凸包,凸包上的点和$P$的斜率满足单峰函数;
    • 三分求值;
  •  #include<cstdio>
    #include<iostream>
    #include<cmath>
    #define ll long long
    using namespace std;
    const int N = ;
    const double eps = 1e-;
    ll n,d,m;
    double x,sum[N],ans;
    char gc(){
    static char *p1,*p2,s[];
    if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    ll rd(){
    ll x = ; char c = gc();
    while(c<''||c>'') c = gc();
    while(c>=''&&c<='') x = x * + c - '',c = gc();
    return x;
    }
    struct point{
    double x,y;
    point(){}
    point(double x,double y):x(x),y(y){}
    point operator -(const point &a){return point(x-a.x,y-a.y);}
    }ch[N],P,p;
    int dcmp(double x){return (fabs(x)<eps)?:x<?-:;}
    double Cro(point a,point b){return a.x*b.y - b.x*a.y;}
    double calc(point a){return a.y/a.x;}
    int main()
    { //freopen("bzoj3203.in","r",stdin);
    //freopen("bzoj3203.out","w",stdout);
    n = rd(); d = rd();
    for(int i = ;i <= n;i++){
    sum[i] = rd() + sum[i-]; x = rd();
    p = point(d*i,sum[i-]);
    while(m>&&Cro(ch[m]-ch[m-],p-ch[m])<=) m--;
    ch[++m] = p;
    P = point(x+i*d,sum[i]);
    int l = ,r = m;
    while(r-l>=){
    int Len = (r-l)/,mid1 = l + Len,mid2 = r - Len;
    if(dcmp(calc(P-ch[mid1])-calc(P-ch[mid2]))<=) l = mid1; else r = mid2;
    }
    double mx = ;
    for(int j = l;j <= r;j++) mx = max(calc(P-ch[j]),mx);
    ans += mx;
    }
    printf("%.0lf\n",ans);
    return ;
    }//by tkys_Austin;

    bzoj3203

bzoj3203【sdoi2013】保护出题人的更多相关文章

  1. [BZOJ3203] [SDOI2013]保护出题人(二分+凸包)

    [BZOJ3203] [SDOI2013]保护出题人(二分+凸包) 题面 题面较长,略 分析 对于第i关,我们算出能够打死前k个个僵尸的最小能力值,再取最大值就可以得到\(y_i\). 前j-1个僵尸 ...

  2. BZOJ3203 SDOI2013保护出题人(三分)

    给a做一个前缀和,那么现在每次所查询的就是(sn-sk)/(bn+nd-(k+1)d)的最大值.这个式子可以看成是(bn+nd,sn)和((k+1)d,sk)所成直线的斜率. 脑补一条直线不断减小斜率 ...

  3. [BZOJ3203][SDOI2013]保护出题人(凸包+三分)

    https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去. #include<cstdio&g ...

  4. [bzoj3203][Sdoi2013]保护出题人

    人生第一道三分?... 把进攻序列里的前i只僵尸看成一个点,横坐标是第i只僵尸到达的时间,纵坐标是这i只僵尸的血量总和..就是说植物必须在这段时间内输出这些伤害..那么单位时间的输出伤害就是斜率了. ...

  5. 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包

    [BZOJ3203][Sdoi2013]保护出题人 Description Input 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + ...

  6. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

  7. 【BZOJ3203】保护出题人(动态规划,斜率优化)

    [BZOJ3203]保护出题人(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 在最优情况下,肯定是存在某只僵尸在到达重点的那一瞬间将其打死 我们现在知道了每只僵尸到达终点的时间,因为僵尸要依次打死 ...

  8. [SDOI2013]保护出题人

    题目 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013的参赛者 ...

  9. 【bzoj3203】[Sdoi2013]保护出题人 凸包+二分

    题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的 ...

  10. BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)

    惊了,我怎么这么菜啊.. 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=3203 (luogu)https://www.lu ...

随机推荐

  1. CS224n-作业1

    0 前言 作业1对应的试题 作业1对应的启动代码 作业1主页 1 Softmax(10分) (a)(5分) 对于向量$x+c$的任一维度$i$,有: \begin{align*}\mbox{softm ...

  2. 笔试题——C++开发简单记录错误模块

    题目:链接:https://www.nowcoder.com/questionTerminal/67df1d7889cf4c529576383c2e647c48 来源:牛客网 解析及代码来源:http ...

  3. python os.walk详解

    os模块大全详情 os.walkos.walk方法,主要用来遍历一个目录内各个子目录和子文件. os.walk(top, topdown=True, onerror=None, followlinks ...

  4. Python set 集合

    简介 python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联 合), intersection(交), difference ...

  5. 马赛克是否无法逆转?Python简单消除,看片无忧!

    图片水印,轻松去除 前段时间玩过了全民K歌,不知道大家是否玩过,还是做得挺好的,就我这嗓子都能唱出张学友的味道,其中更是有消除噪声的功能,就是朋友们都在吃鸡大叫,我在旁边唱歌依然不受影响. 既然声音可 ...

  6. django_models_Meta字段详解

    Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.而可用的选项大致包含以下几类 abstract 这个属性是定义当前的模型是不是一个抽象类.所谓抽象类是不会对应数据 ...

  7. Daily Scrum2 11.4

    昨天的任务大家都已经完成,daily scrum记录的是当日已经完成的任务. 今日任务列表: 杨伊:完成团队作业之软件测评的功能部分 徐钧鸿:CodingCook的model和helper部分 张艺: ...

  8. 团队博客作业Week1 --- 团队成员简介

    团队博客作业Week1 团队作业1 我们团队是一个以功能团队模式组建而成的团队,我们总共有5位队员,分别是:李剑锋.陈谋.卢惠明.潘成鼎.仉伯龙. 中间的那位就是李剑锋,我们的PM(项目经理).性格热 ...

  9. 团队计划backlog---DayTwo

    任务索引卡(Two): 1.  季方:实现界面跳转,数据库相关数据的显示 的测试: 2.  司宇航:添加部分团队博客,并测试: 3.  王金萱.马佳慧:学习爬虫的相关内容,为将来统计博客部分做准备: ...

  10. 旧文备份:CANopen协议中SDO服务

    SDO是服务数据对象接口(Service Data Obiect)的缩写,顾名思义提供服务数据的访问接口,服务数据就是一些实时性要求不高的数据,一般是指节点配置参数,因此,SDO一般用来配置和获得节点 ...