惊了,我怎么这么菜啊。。

题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=3203

(luogu)https://www.luogu.org/problemnew/show/P3299

题解: 先讲正常做法。

设\(S_i\)为\(i\)的前缀和,则显然第\(i\)次答案为\(\max^i_{j=1} \frac{S_i-S_{j-1}}{x_i+id-jd}\)

那么很显然就是要求从一个点\((x_i+id,S_i)\)到\((jd,S_{j-1})\)的斜率最大值啊。。三分凸壳就行了啊。。想什么呢。。。


下面是我的垃圾做法,有兴趣的可以感受一下(我相信没人有兴趣)

考虑斜率优化(我就是陷入套路无法自拔的垃圾),首先为了方便我们把输入的\(x_i\)加上\(id\)并记作\(x_0\), 目前的总和记作\(S\), \(1\)到\((i-1)\)的和记作\(S_i\)(和上面定义不同),考虑\(i\)不比\(j\)差(\(i<j\))的条件: \[\frac{S-S_i}{x_0-id}>\frac{S-S_j}{x_0-jd}\]展开后解得\[x_0\ge\frac{iS-jS-iS_j+jS_i}{S_j-S_i}d\]考虑三个点\(i<j<k\), \(i\)不比\(j\)劣的条件是\[x_0\ge\frac{iS-jS-iS_j+jS_i}{S_j-S_i}d\] \(k\)不比\(j\)劣的条件是\[x_0\le\frac{jS-kS-jS_k+kS_j}{S_k-S_j}d\]若后者大于等于前者则无论\(x_0\)为何值此两个条件至少满足一个,\(j\)无用。

然后尝试化这个式子: \[\frac{jS-kS-jS_k+kS_j}{S_k-S_j}\ge \frac{iS-jS-iS_j+jS_i}{S_j-S_i}\] \[iS_jS_k-iS_j^2-jS_iS_k+jS_iS_j+jSS_k-jSS_j-iSS_k+iSS_j\le jS_kS_j-jS_iS_k-kS_j^2+kS_iS_j+kSS_j-kSS_i-jSS_j+jSS_i\] \[(i-j)S_jS_k+(k-i)S_j^2+(j-k)S_iS_j+(j-i)SS_k+(i-k)SS_j+(k-j)SS_i\le 0\] 尝试因式分解 \[(S_j-S)(iS_k-jS_k+kS_j-iS_j+jS_i-kS_i)\le 0\] 因为\(S_j-S\)显然小于\(0\), 所以\[iS_k-jS_k+kS_j-iS_j+jS_i-kS_i\ge 0\] 这个东西一看就是可以拆添项的: \[iS_k-jS_k+kS_j-jS_j-iS_j+jS_j+iS_k-jS_k\le 0\] \[(j-k)(S_i-S_j)-(i-j)(S_j-S_k)\le 0\] \[\frac{S_i-S_j}{i-j}\le \frac{S_j-S_k}{j-k}\]

这是\(j\)无用的条件,所以只需要维护斜率不增的上凸壳即可

……

我真的蠢到一定境界了

代码

当然是我的垃圾做法的代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#define llong long long
using namespace std;struct Point
{double x,y;Point() {}Point(llong _x,llong _y) {x = _x,y = _y;}
};
const int N = 1e5;
Point ch[N+3];
double s[N+3];
double a[N+3];
double qr[N+3];
int n,tp;
double d;void insertpoint(Point x)
{while(tp>1 && (ch[tp].y-ch[tp-1].y)*(x.x-ch[tp].x)>=(x.y-ch[tp].y)*(ch[tp].x-ch[tp-1].x)) {tp--;}tp++; ch[tp] = x;
//  printf("CH: size=%d ",tp);
//  for(int i=1; i<=tp; i++) printf("(%lf %lf) ",ch[i].x,ch[i].y); puts("");
}double query(double x,double sum)
{
//  printf("query(%lf %lf)\n",x,sum);int left = 1,right = tp;while(left<right){int mid = (left+right+1)>>1;bool ok = x*(ch[mid].y-ch[mid-1].y)<=(ch[mid-1].x*ch[mid].y-ch[mid].x*ch[mid-1].y+ch[mid].x*sum-ch[mid-1].x*sum)*d ? true : false;if(ok) {left = mid;}else {right = mid-1;}}
//  printf("left=%d\n",left);double ret = (sum-ch[left].y)/(x-ch[left].x*d);return ret;
}int main()
{scanf("%d%lf",&n,&d);for(int i=1; i<=n; i++){scanf("%lf%lf",&a[i],&qr[i]);s[i] = s[i-1]+a[i-1];qr[i] += i*d;}s[n+1] = s[n]+a[n];double sans = 0.0;for(int i=1; i<=n; i++){insertpoint(Point(i,s[i]));double ans = query(qr[i],s[i+1]);sans += ans;
//      printf("i%d ans%lf\n",i,ans);}printf("%lld\n",(llong)(sans+0.5));return 0;
}

BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)相关推荐

  1. [选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)

    多年不考试,一夜回到解放前 T1:花园 title solution code T2:月亮神树 title solution code T3:保护出题人 title solution code T1: ...

  2. BZOJ 3203 Sdoi2013 保护出题人 凸包+三分

    题目大意:太长自己看 令sumi表示第i个僵尸以及之前的僵尸的体力总和.disi表示第i个僵尸与房屋的初始距离 我们发现我们能消灭一个僵尸当且仅当y>=sumidisi 那么我们要求的显然就是m ...

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

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

  4. bzoj3203 [Sdoi2013]保护出题人 凸包+二分

    一开始以为丧尸可以挡伤害,然后发现这个题目的设定非常** 然后就考虑每个丧尸到门口的时间,由于伤害是继承的,所以前缀和分配 然后答案=Σ(HP前缀和*速度/距离)  设 HP/l=k ,l=x+nd ...

  5. [bzoj3203][SDOI2013]保护出题人

    3203: [Sdoi2013]保护出题人 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 389 Solved: 218 [Submit][Status ...

  6. bzoj3203: [Sdoi2013]保护出题人

    我三分这么好吗居然1A啦???提交的时候只是想着先WA一次的.... 这题真的很妙啊 首先第一步,就是把僵尸的生命值取一个前缀和,这样造成伤害的时候,可以视为同时对所有僵尸造成伤害. 那么就可以得到一 ...

  7. BZOJ 3203 sdoi 2013 保护出题人

    由于样例解释很清晰,所以很容易得到以下结论: 1.每一关都是独立的,且僵尸的相对位置不会变 2.每一关的攻击力=Max(sum(i)/dis(i)) 其实sum(i)是僵尸攻击力的前缀和,dis(i) ...

  8. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay) 手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.ne ...

  9. luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...

最新文章

  1. 「AI初识境」深度学习中常用的损失函数有哪些?
  2. python工程师月薪-在三线城市,Python工程师也能拿到月薪20K?
  3. brew 镜像_Docker牛刀小试:安装及常用的镜像命令和容器命令
  4. 动手学无人驾驶(3):基于激光雷达3D多目标追踪
  5. 计算机配件推荐系统论文摘要,个性化推荐系统设计
  6. 图灵奖颁给深度学习三巨头,他们曾是一小撮顽固的“蠢货”
  7. 整合TextBox与Label 创建新控件--EFLabelText
  8. 疯狂java讲义第二章课后习题答案
  9. 【Java】按要求编程输出2018年日历
  10. SQL中的左连接和右连接
  11. 北京IMAX影院全攻略
  12. STM32学习笔记——USB鼠标
  13. 用Python找101-200之间的素数
  14. 模拟量的输入和输出问题及选型
  15. 【转】PCL室内三维重建
  16. 使用PID—tuner做参数整定
  17. 优先队列(priority_queue)
  18. CMOS图像传感器——概述
  19. Keil MDK使用第11篇---keil炫酷颜色主题
  20. python pandas AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘

热门文章

  1. 《TensorFlow 机器学习方案手册》(附 pdf 和完整代码)
  2. 简述推荐系统中的矩阵分解
  3. VTK修炼之道25:图像基本操作_图像子块提取(特征区域提取)
  4. matlab 读取含有文本的txt
  5. 转换到 COFF 期间失败: 文件无效或损坏
  6. 使用HttpSessionBindingListener方法
  7. .html?t=1a=2类似传递参数到flex中
  8. 利用nf_conntrack机制存储路由,省去每包路由查找
  9. Python 学习之列表
  10. 【windows gdi+】GDI+ Image类加载图片时异常问题处理与分析