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归并排序,这个时候不用考虑第一次的顺序,第三次用树状数组 ...
随机推荐
- new操作符具体干了什么
function Func(){ }; var newFunc=new Func (); new共经过了4个阶段 1.创建一个空对象 var obj=new Object(); 2.设置原型链 把 o ...
- Java单例模式的6种写法
在Java中,单例有很多种写法,面试时,手写代码环节,除了写算法题,有时候也会让手写单例模式,这里记录一下单例的几种写法和优缺点. 初级写法 懒汉式 饿汉式 双锁检验 内部类 枚举式 1.初级写法 p ...
- java语言基础-类型运算细节
代码一: public class varDemo{ public static void main(String[] args) { byte a2; a2=3+4; System.out.prin ...
- Codeforces GYM 100741A . Queries
time limit per test 0.25 seconds memory limit per test 64 megabytes input standard input output stan ...
- 小知识~VS2012的xamarin加载失败解决
1 由于Nuget版本过低导致的,工具->扩展和更新->在线更新->对nuget程序包程序器进行升级即可 错误代码: 错误 4 错误: 缺少来自类“NuGet.Visua ...
- EXPLAIN - 显示语句执行规划
SYNOPSIS EXPLAIN [ ANALYZE ] [ VERBOSE ] statement DESCRIPTION 描述 这条命令显示PostgreSQL规划器为所提供的语句生成的执行规划. ...
- 基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table
基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table https://segmentfault.com/a/1190000015970367
- Qt 之 QApplication
1.QApplication QApplication类管理GUI程序的控制流和主要设置,是基于QWidget的,为此特化了QGuiApplication的一些功能,处理QWidget特有的初始化和结 ...
- 爬虫学习之第一次获取网页内容及BeautifulSoup处理
from urllib.request import urlopen from urllib.request import HTTPError from bs4 import BeautifulSou ...
- git 超时 时长 设置?
[Pipeline] { (Checkout) [Pipeline] checkout > git.exe rev-parse --is-inside-work-tree # timeout=1 ...