洛谷传送门

题目大意:太长略

每新加入一个僵尸,容易得到方程$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+d(i-j)}}$

即从头开始每一段僵尸都需要在规定距离内被消灭

展开式子,可得$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+di-dj}}$

是不是很像斜率的式子= = ----$(y2-y1)/(x2-x2)$

维护一个下凸包,这次不是用直线去切凸包,而是把凸包上每个点都向一个定点去连直线,求最大的斜率

会发现,凸包上连出来的直线的斜率是一个凸函数,再利用三分法进行查找

三分法类似于一个爬坡的过程,每次都缩小两侧山坡范围,最终找到山顶

至于为什么维护下凸包呢,画个图就明白了,如果之前某个点$a$,与点$b(b_{x}<a_{x})$的斜率,大于新加入的点$i$与$b$的斜率,那么如果右侧出现一个点,向他们连直线,显然$i$的斜率大于$a$,可以用三角形的性质去证

因为$x$递增,用单调栈维护下凸包即可

时间$O(nlogn)$

貌似比较斜率必须用$double$,不然爆$long\;long$

 #include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 101000
#define M1 205
#define ll long long
#define dd double
#define uint unsigned int
using namespace std; ll gll()
{
ll ret=;int fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n;
ll D;
ll a[N1],s[N1],sa[N1];
ll x[N1],y[N1];
int stk[N1],tp;
inline dd gslope(int i,int j){
return 1.0*(y[i]-y[j])/(x[i]-x[j]);
} int main()
{
//freopen("t2.in","r",stdin);
scanf("%d%lld",&n,&D);
for(int i=;i<=n;i++)
a[i]=gll(),s[i]=gll(),sa[i]=sa[i-]+a[i];
dd ans=;
for(int i=;i<=n;i++)
{
x[i]=1.0*i*D,y[i]=sa[i-];
while(tp>&&gslope(stk[tp],stk[tp-])>=gslope(i,stk[tp-]))
tp--;
stk[++tp]=i;
int l=,r=tp,mid1,mid2;
x[]=1.0*s[i]+1.0*D*i,y[]=sa[i];
while(r-l>=)
{
mid1=(l+l+r)/,mid2=(l+r+r)/;
if(gslope(,stk[mid1])>gslope(,stk[mid2]))
r=mid2;
else
l=mid1;
}
dd ma=;
for(int j=l;j<=r;j++)
ma=max(ma,gslope(,stk[j]));
ans+=ma;
}
printf("%.0lf\n",ans);
return ;
}

最新文章

  1. 简单代码在ABAP中实现声音的播放
  2. Quartz1.8.5例子(六)
  3. 关于Core Data的一些整理(一)
  4. 五、C# 类
  5. android:configChanges 屏幕横竖屏切换
  6. Class类对象的三种实例化方法
  7. SQL代理执行EXE可执行程序
  8. 学习vi(1)
  9. mac 安装mysql特种报错的对应解决方式
  10. 【JavaScript中typeof、toString、instanceof、constructor与in】
  11. 新书《Ext JS 4.2 实战》终于出炉了
  12. 20165223《网络对抗技术》Exp1 PC平台逆向破解
  13. Eclipse MAT 安装及使用
  14. Android Studio中使用Git进行代码管理(分支、合并)
  15. python爬虫学习之正则表达式的基本使用
  16. C#中准确跟踪错误异常所在的文件位置方法
  17. BZOJ.2199.[USACO2011 Jan]奶牛议会(2-SAT)
  18. storm安装以及简单操作
  19. 20145127《java程序设计》第二周学习总结
  20. wilber3申请数据的直接目录寻找

热门文章

  1. jenkins 打包 springboot
  2. Linux磁盘分区--GPT分区
  3. PHP算法之判断是否是质数
  4. Spring管理流程部署——Activiti
  5. Ubuntu16.04添加源的地址
  6. 基本socket api
  7. HDU 4394 BFS
  8. exFAT格式
  9. 24岁菜鸟,能一个人撑起App开发吗
  10. UVA - 10043 Chainsaw Massacre