CDQ分治模板
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define eps 1e-9
using namespace std;
const int M=;
int n,i,top,stack[M];
double f[M];
struct shit{double x,y,k,a,b,rate;int id;}p[M],q[M];
bool cmp(shit x,shit y){return x.k>y.k;}
double K(int x,int y){
if (!y)return -1e20;
if (fabs(q[x].x-q[y].x)<eps)return 1e20;
return (q[y].y-q[x].y)/(q[y].x-q[x].x);
}
void cdq(int l,int r){
int mid=l+r>>,L=l,R=mid+,j=;
if (l==r){
f[l]=max(f[l],f[l-]);
q[l].y=f[l]/(q[l].rate*q[l].a+q[l].b);
q[l].x=q[l].y*q[l].rate;
return; 更新ans,利用已经计算好的l的最优决策k,计算f [l]值,Exit
}
for (int i=l;i<=r;i++)
if (q[i].id<=mid)p[L++]=q[i];
else p[R++]=q[i];
for (int i=l;i<=r;i++)q[i]=p[i];
cdq(l,mid);
top=;
for (int i=l;i<=mid;i++){
while (top>&&K(stack[top-],stack[top])<K(stack[top-],i)+eps)top--;
stack[++top]=i; 对[l, mid-]这一段扫描一遍计算出决策的凸线,
}
stack[++top]=;
for (int i=mid+;i<=r;i++){
while (j<top&&K(stack[j],stack[j+])+eps>q[i].k)j++;
f[q[i].id]=max(f[q[i].id],q[stack[j]].x*q[i].a+q[stack[j]].y*q[i].b);
由于[mid+ .. r]这一段以 -a[i] / b[i]的排序在预处理已经完成,
因此只需要扫描一遍更新[mid + .. r] 的最优决策.
}
cdq(mid+,r);
L=l,R=mid+;
for (int i=l;i<=r;i++)
if (((q[L].x<q[R].x||(fabs(q[L].x-q[R].x)<eps&&q[L].y<q[R].y))||R>r)&&L<=mid)p[i]=q[L++];
else p[i]=q[ ++];
for (int i=l;i<=r;i++)q[i]=p[i]; 利用[l, mid-]已排好序的f []值和[mid+, r]已排好序的f []值归并排序将 [l, r]这一段按f[]值排序.
}
int main(){
scanf("%d%lf",&n,&f[]);
for (i=;i<=n;i++){
scanf("%lf%lf%lf",&q[i].a,&q[i].b,&q[i].rate);
q[i].k=-q[i].a/q[i].b;
q[i].id=i;
}
sort(q+,q+n+,cmp);
cdq(,n);
printf("%.3lf\n",f[n]);
}
CDQ分治模板的更多相关文章
- 洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)
在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前), ...
- bzoj3262(cdq分治模板)
裸的cdq,注意去重: #include<iostream> #include<cstdio> #include<cmath> #include<cstrin ...
- [BOI2007]Mokia 摩基亚(CDQ分治)
upd:\((x1,y1)(x2,y2)\)表示以\((x1,y1)\)为左上端点 \((x2,y2)\)为右下端点的矩形 本来以为是一道二位树状数组的模板,但是看数据范围之后就放弃了,边界既然到了2 ...
- P3157 [CQOI2011]动态逆序对 CDQ分治
一道CDQ分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...
- 洛谷P3810 陌上花开(CDQ分治)
洛谷P3810 陌上花开 传送门 题解: CDQ分治模板题. 一维排序,二维归并,三维树状数组. 核心思想是分治,即计算左边区间对右边区间的影响. 代码如下: #include <bits/st ...
- Educational Codeforces Round 41 967 E. Tufurama (CDQ分治 求 二维点数)
Educational Codeforces Round 41 (Rated for Div. 2) E. Tufurama (CDQ分治 求 二维点数) time limit per test 2 ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- 【洛谷4721】【模板】分治FFT(CDQ分治_NTT)
题目: 洛谷 4721 分析: 我觉得这个 "分治 FFT " 不能算一种特殊的 FFT ,只是 CDQ 分治里套了个用 FFT (或 NTT)计算的过程,二者是并列关系而不是偏正 ...
- P3810 【模板】三维偏序(陌上花开)cdq分治
传送门:https://www.luogu.org/problemnew/show/P3810 cdq分治的模板题,第一层外部排序,第二层cdq归并排序,这个时候不用考虑第一次的顺序,第三次用树状数组 ...
随机推荐
- 关于重置功能(type="reset")的相关问题
当一个按钮具有 type="reset";的按钮是具有重置表单标签的功能的,但是当具有type="hidden"; 属性的标签的值就不会被重置,这点要留意.可以 ...
- 获得select被选中option的value和text
一:JavaScript原生的方法 1:得到select对象: var myselect=document.getElementById(“test”); 2:得到选中项的索引:var index=m ...
- COGS 2098. Asm.Def的病毒
★☆ 输入文件:asm_virus.in 输出文件:asm_virus.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持 ...
- HALCON算子1
https://blog.csdn.net/think_fast/article/details/7011364 待验证学习
- python-seaborn绘图
https://zhuanlan.zhihu.com/p/27435863 Seaborn(sns)官方文档学习笔记系列
- maven打包的含义
我们在用maven构建java项目时,最常用的打包命令有mvn package.mvn install.deploy,这三个命令都可完成打jar包或war(当然也可以是其它形式的包)的功能,但这三个命 ...
- Hystrix 断路器
断路器: 当客户端访问服务端,发现服务端有异常不能进行访问时,就会执行一个fallback 方法.
- JSP常用的几种跳转方式
一, 使用href超链接标记 (客户端跳转) 二, 提交表单 (客户端跳转) <form name="fo ...
- 在Foxmail邮件客户端登录263企业邮箱
一.问题描述 首次用Foxmail登录263企业,输入账号和密码,创建 二.问题分析 客户端配置地址: 协议类型 服务器地址 默认端 加密端(SSL) POP pop.263.net 110 1995 ...
- 对数组内容使用了json_encode返回汉字内容返回了空值
如果使用json_encode对数组进行转成JSON字符串时候,发现汉字的全部为空,这样可以说明的一点是你的页面上用的一定不是UTF8编码,在PHP手册中对json_encode中待编码的值已经说明所 ...