http://www.lydsy.com/JudgeOnline/problem.php?id=1492

(题目描述太长了不粘贴了……)

………………………………………………………

是自己做的

抄开心

……………………………………………………………

所以……emm,简单的dp就是:

f(i)=max(a[i]*x[j]+b[i]*y[j])

其中x和y表示在第i 天,用最多的钱能够换成的A券和B券。

完后……这怎么斜率优化啊……如果把x和y看做点来斜率优化的话它们也没有单调性啊。

推荐一个博客,可以在这里看推导式子(其实是我懒):http://blog.csdn.net/lych_cys/article/details/50674962

平衡树固然可以解决问题,但是CDQ分治在这种问题上显得更加睿智。

我们完全可以对其变成一维排a/b,二维CDQ一下它们出现时间t,三维求f。把每个点看做询问和添加操作即可。

剩下的就是单调队列基础操作了。

(题解瞎编完了hhh)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef double dl;
const int N=1e5+;
struct node{
dl x,y;
inline bool operator <(const node &b)const{
return x<b.x||x==b.x&&y<b.y;
}
}p[N],que[N];
int n,t[N],tmp[N];
dl f[N],a[N],b[N],rate[N],ans;
inline bool cmp(int x,int y){
return a[x]*b[y]<a[y]*b[x];
}
inline bool slope(node k,node j,node i){
return (j.x-i.x)*(k.y-i.y)-(j.y-i.y)*(k.x-i.x)<=;
}
inline dl suan(node j,int i){
return j.x*a[i]+j.y*b[i];
}
void cdq(int l,int r){
if(l==r){
f[l]=max(f[l],f[l-]);
ans=max(ans,f[l]);
p[l].y=f[l]/(a[l]*rate[l]+b[l]);
p[l].x=p[l].y*rate[l];
return;
}
int mid=(l+r)>>,idx1=l,idx2=mid+,ql=,qr=;
for(int i=l;i<=r;i++){
if(t[i]<=mid)tmp[idx1++]=t[i];
else tmp[idx2++]=t[i];
}
for(int i=l;i<=r;i++)t[i]=tmp[i];
cdq(l,mid);
for(int i=l;i<=mid;i++){
while(qr>&&slope(que[qr-],que[qr],p[i]))qr--;
que[++qr]=p[i];
}
for(int i=mid+;i<=r;i++){
int j=t[i];
while(ql<qr&&suan(que[ql],j)<=suan(que[ql+],j))ql++;
f[j]=max(f[j],suan(que[ql],j));
}
cdq(mid+,r);
if(l==&&r==n)return;
ql=l,idx1=l,idx2=mid+;
while(ql<=r){
if(idx2>r||idx1<=mid&&p[idx1]<p[idx2])que[ql++]=p[idx1++];
else que[ql++]=p[idx2++];
}
for(int i=l;i<=r;i++)p[i]=que[i];
return;
}
int main(){
scanf("%d%lf",&n,&f[]);
for(int i=;i<=n;i++){
scanf("%lf%lf%lf",&a[i],&b[i],&rate[i]);
t[i]=i;
}
sort(t+,t+n+,cmp);
cdq(,n);
printf("%.3lf\n",ans);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ1492:[NOI2007]货币兑换——题解的更多相关文章

  1. [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)

    [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...

  2. [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5838  Solved: 2345[Submit][Sta ...

  3. BZOJ1492: [NOI2007]货币兑换Cash 【dp + CDQ分治】

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 5391  Solved: 2181 [Submit][S ...

  4. bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5541  Solved: 2228[Submit][Sta ...

  5. bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash

    http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...

  6. [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5907  Solved: 2377[Submit][Sta ...

  7. BZOJ1492 [NOI2007]货币兑换

    Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...

  8. BZOJ1492: [NOI2007]货币兑换Cash

    设$x_j$,$y_j$为第$j$天能买的A,B券数量,$f_i$为第$i$天的最大收益.$f_i=\max_{1\le j<i}a_ix_j+b_iy_j$,最大化$f_i$即找一个点$(x_ ...

  9. Bzoj1492: [NOI2007]货币兑换Cash(不单调的斜率优化)

    题面 传送门 Sol 题目都说了 必然存在一种最优的买卖方案满足: 每次买进操作使用完所有的人民币: 每次卖出操作卖出所有的金券. 设\(f[i]\)表示第\(i\)天可以有的最大钱数 枚举\(j&l ...

随机推荐

  1. RF上传图片各种失败坑,使用pywin32来操作windows窗体

    这个上传按钮,使用 Choose File,失败不知道为什么... Name:Choose FileSource:Selenium2Library <test library>Argume ...

  2. APP性能测试工具-GT(随身调)

    GT(随身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment).利用GT,仅凭一部手机,无需连接电脑,您即可对AP ...

  3. 凸包算法(Graham扫描法)详解

    先说下基础知识,不然不好理解后面的东西 两向量的X乘p1(x1,y1),p2(x2,y2) p1Xp2如果小于零则说明  p1在p2的逆时针方向 如果大于零则说明 p1在p2的顺时针方向 struct ...

  4. JDK源码分析:Short.java

    Short是基本数据类型short的包装类. 1)声明部: public final class Short extends Number implements Comparable<Short ...

  5. SpringCloud IDEA 教学 (三) Eureka Client

    写在前头 本篇继续介绍基于Eureka的SpringCloud微服务搭建,回顾一下搭建过程, 第一步:建立一个服务注册中心: 第二步:建立微服务并注入到注册中心: 第三步:建立client端来访问微服 ...

  6. 【转】MySQLroot用户忘记密码解决方案(安全模式,修改密码的三种方式)

    文章出自:http://www.2cto.com/database/201412/358128.html 1.关闭正在运行的MySQL2.启动MySQL的安全模式,命令如下: ? 1 mysqld - ...

  7. Rescue(BFS时间最短 另开数组或优先队列)

    Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M ...

  8. Java 集合框架之 Map

    Hashtable Hashtable 的实例有两个参数影响其性能:初始容量 和加载因子.容量 是哈希表中桶 的数量,初始容量就是哈希表创建时的容量.注意,哈希表的状态为 open:在发生“哈希冲突” ...

  9. Coursera-Note: Internet History, Technology and Secure (1st week to 9th week)

    目录 Coursera-Note: Internet History, Technology and Secure 第一周 第二周 数据交换: Packet switching技术: 第三周 创造ht ...

  10. android仿系统Launcher界面,实现分屏,左右滑动效果(ViewSwitcher)

    ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitche ...