#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<cstdio>
using namespace std; const int N = 30000;
const double INF = 1e8;
int n , l , a[N + 5] , b[N + 5] , c[N + 5] , q[N + 5] , head , tail , Mk , Mc;
double ans , f[N + 5] , w[N + 5];
struct tree{double max , tag;}t[(N << 2) + 5]; inline double max(double x , double y) {return x > y ? x : y;} inline void build(int l , int r , int k)
{
t[k] = (tree){0 , 0};
if (l == r)
{
t[k].max = f[l];
return;
}
int mid = (l + r) >> 1;
if (l <= mid) build(l , mid , k << 1);
if (r > mid) build(mid + 1 , r , k << 1 | 1);
t[k].max = max(t[k << 1].max , t[k << 1 | 1].max);
} inline void pushdown(int k)
{
if (!t[k].tag) return;
t[k << 1].max += t[k].tag;
t[k << 1 | 1].max += t[k].tag;
t[k << 1].tag += t[k].tag;
t[k << 1 | 1].tag += t[k].tag;
t[k].tag = 0;
} inline void update(int l , int r , int k , int x , double v)
{
if (l == r && l == x)
{
t[k].max = v;
return;
}
int mid = (l + r) >> 1;
pushdown(k);
if (x <= mid) update(l , mid , k << 1 , x , v);
if (x > mid) update(mid + 1 , r , k << 1 | 1 , x , v);
t[k].max = max(t[k << 1].max , t[k << 1 | 1].max);
} inline void change(int l , int r , int k , int tl , int tr , double v)
{
if (l >= tl && r <= tr)
{
t[k].tag += v;
t[k].max += v;
return;
}
int mid = (l + r) >> 1;
pushdown(k);
if (tl <= mid) change(l , mid , k << 1 , tl , tr , v);
if (tr > mid) change(mid + 1 , r , k << 1 | 1 , tl , tr , v);
t[k].max = max(t[k << 1].max , t[k << 1 | 1].max);
} inline double query(int l , int r , int k , int tl , int tr)
{
if (l >= tl && r <= tr) return t[k].max;
int mid = (l + r) >> 1;
double res = -INF;
pushdown(k);
if (tl <= mid) res = max(res , query(l , mid , k << 1 , tl , tr));
if (tr > mid) res = max(res , query(mid + 1 , r , k << 1 | 1 , tl , tr));
return res;
} inline bool check(double m)
{
for(register int i = 1; i <= n; i++) w[i] = a[i] - b[i] * m , f[i] = -INF;
f[0] = 0;
build(0 , n , 1);
q[head = tail = 1] = 0;
for(register int i = 1; i <= n; i++)
{
while (head < tail && c[i] >= c[q[tail]])
{
change(0 , n , 1 , q[tail - 1] , q[tail] - 1 , -w[q[tail]]);
tail--;
}
q[++tail] = i;
change(0 , n , 1 , q[tail - 1] , q[tail] - 1 , w[q[tail]]);
f[i] = query(0 , n , 1 , i - l > 0 ? i - l : 0 , i - 1);
update(0 , n , 1 , i , f[i]);
}
return f[n] >= 0;
} int main()
{
// freopen("逃跑.in" , "r" , stdin);
scanf("%d%d" , &n , &l);
for(register int i = 1; i <= n; i++) scanf("%d%d%d" , &a[i] , &b[i] , &c[i]);
c[0] = INF;
double l = 0 , r = 1e6 , mid;
for(register int i = 1; i <= 60; i++)
{
mid = (l + r) * 0.5;
if (check(mid)) l = mid , ans = mid;
else r = mid;
} if (ans == 0)
{
puts("0.000000000e+000");
return 0;
}
Mk = 0 , Mc;
if (ans < 1)
{
while (ans < 1) ans *= 10 , Mk++;
printf("%.9lfe-" , ans);
if (Mk == 0) Mc = 3;
else if (Mk < 10) Mc = 2;
else if (Mk < 100) Mc = 1;
else Mc = 0;
while (Mc--) putchar('0');
if (Mk > 0) printf("%d" , Mk);
return 0;
}
while (ans >= 10) ans /= 10 , Mk++;
printf("%.9lfe+" , ans);
if (Mk == 0) Mc = 3;
else if (Mk < 10) Mc = 2;
else if (Mk < 100) Mc = 1;
else Mc = 0;
while (Mc--) putchar('0');
if (Mk > 0) printf("%d" , Mk);
}

最新文章

  1. jQuery通过parent()和parents()方法访问父级元素
  2. doctype声明的重要性-------这绝对是ie的坑, 与angular无关, 我错怪你啦
  3. 屏蔽input导致的回车提交事件
  4. Android SDK Manager无法下载的问题
  5. 关于mysql数据库在输入密码后,滴的一声直接退出界面的解决办法
  6. Unity--截取屏幕任意区域
  7. HDOJ/HDU 2140 Michael Scofield&#39;s letter(字符转换~)
  8. ###Git 基础图解、分支图解、全面教程、常用命令###
  9. Spring、整合Spring+JDBC
  10. Swift - 一步步教你使用SpriteKit创建开发游戏项目
  11. 解决ios微信页面回退不刷新的问题
  12. java基础(一) 深入解析基本类型
  13. Linux系统启动详解
  14. 【代码笔记】Web-JavaScript-JavaScript 类型转换
  15. Docker Mongo数据库开启用户认证
  16. MariaDB和mySQL到底区别在哪,实验说明问题!
  17. Java LinkedList工作原理及实现
  18. 基础005_V7-Select IO
  19. ubuntu 16.04 安装pycharm
  20. mongodb简介和特性

热门文章

  1. integer 拆箱装箱以及范围
  2. 初次邂逅 EasyExcel
  3. 【java】【File】用File相关类写一个小工具,完成从指定目录下抽取指定文件并复制到新路径下完成重命名的功能
  4. jupyter 数据显示设置
  5. 一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中自定义控件制作和调用、TCP协议下文件的收发 、以及可执行文件的打包
  6. war包形式安装jenkins
  7. vue 点击按钮添加一行dom节点
  8. JavaScript:是一种什么样的编程语言?
  9. [编程基础] C#自定义类调用窗体控件
  10. 经典 backbone 总结