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归并排序,这个时候不用考虑第一次的顺序,第三次用树状数组 ...
随机推荐
- 初次使用引用外部js心得
在外部引用自己编辑的js时建立链接写在头部中是会出错的,如下图 错误如下: 这是一个是我初学时遇到的一个算是低级错误吧,看到这个错误,我以为的是我引用的js中编辑的代码是不是哪里写错了,但是看了好多遍 ...
- 【程小白】Java基本特性
一.StringBuffer.StringBuilder的区别 StringBuffer是线程安全的,StringBuilder是线程不安全的.所以以后在单线程中,如果涉及大量字符串操作,还是用Str ...
- Android CursorAdapter的使用
CursorAdapter继承于BaseAdapter,为Cursor和ListView连接提供了桥梁. 首先看一下CursorAdapter的部分源码: /** * @see android.wid ...
- PHP实时输出内容到浏览器
buffer buffer是一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域.通过buffer,可以 ...
- os x 中出现message sent to deallocated instance 的错误总结
一般是程序中的某一个对象被release 了两次 一般情况下是与你定义的类型有关 这里面我的错误是吧 NSString 类型的变量的属性 设置为了 assign 了 目测与这个有关 补充object- ...
- SQLite -附加数据库
SQLite -附加数据库 考虑情况下当你有多个数据库可用,您希望使用其中任何一个.SQLite附加DTABASE语句用于选择一个特定的数据库,这个命令之后,所有SQLite语句将执行以下附加数据库. ...
- UVA10129———欧拉道路
题目 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如 acm,malform,mouse).每个单词最多包含1000 ...
- Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- k8s集群部署之环境介绍与etcd数据库集群部署
角色 IP 组件 配置 master-1 192.168.10.11 kube-apiserver kube-controller-manager kube-scheduler etcd 2c 2g ...
- Tunnelier使用说明
Tunnelier与MyEnTunnel类似,但是功能更加强大.MyEnTunnel小巧易用,如何使用MyEnTunnel可以参考 MyEnTunnel使用说明 这里列下Tunnelier的优点: 1 ...