[BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包
1492: [NOI2007]货币兑换Cash
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 5907 Solved: 2377
[Submit][Status][Discuss]
Description
.png)
.png)
Input
Output
只有一个实数MaxProfit,表示第N天的操作结束时能够获得的最大的金钱数目。答案保留3位小数。
Sample Input
1 1 1
1 2 2
2 2 3
Sample Output
HINT
.png)
Source
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define eps 1e-9
#define maxn 120000
#define inf 2147483647
using namespace std;
struct P {
double x,y;
}p[maxn],pp[maxn];
bool operator <(P t1,P t2){return (t1.x<t2.x+eps)||(fabs(t1.x-t2.x)<=eps&&t1.y<t2.y+eps);}
struct data {
double q,a,b,rate,k;
int pos;
}ask[maxn],askt[maxn];
int n;
double f[maxn];
bool cmp(data t1,data t2) {return t1.k<t2.k;}
double get(int i,int j) {
if(!i) return -inf;
if(!j) return inf;
if(fabs(p[i].x-p[j].x)<=eps) return -inf;
return (p[i].y-p[j].y)/(p[i].x-p[j].x);
}
int sta[maxn];
void cdq(int l,int r) {
if(l==r) {
f[l]=max(f[l-],f[l]);
p[l].y=f[l]/(ask[l].a*ask[l].rate+ask[l].b);
p[l].x=p[l].y*ask[l].rate;
return;
}
int mid=l+r>>,l1=l,l2=mid+;
for(int i=l;i<=r;i++)
if(ask[i].pos<=mid) askt[l1++]=ask[i];
else askt[l2++]=ask[i];
for(int i=l;i<=r;i++) ask[i]=askt[i];
cdq(l,mid);
int top=;
for(int i=l;i<=mid;i++) {
while(top>=&&get(i,sta[top])+eps>get(sta[top],sta[top-])) top--;
sta[++top]=i;
}
int j=;
for(int i=r;i>=mid+;i--) {
while(j<top&&ask[i].k<get(sta[j],sta[j+])+eps) j++;
f[ask[i].pos]=max(f[ask[i].pos],p[sta[j]].x*ask[i].a+p[sta[j]].y*ask[i].b);
}
cdq(mid+,r);
l1=l,l2=mid+;
for(int i=l;i<=r;i++) {
if((p[l1]<p[l2]||l2>r)&&l1<=mid) pp[i]=p[l1++];
else pp[i]=p[l2++];
}
for(int i=l;i<=r;i++) p[i]=pp[i];
}
int main() {
scanf("%d%lf",&n,&f[]);
for(int i=;i<=n;i++) {
scanf("%lf%lf%lf",&ask[i].a,&ask[i].b,&ask[i].rate);
ask[i].k=-ask[i].a/ask[i].b;ask[i].pos=i;
}
sort(ask+,ask+n+,cmp);
cdq(,n);
printf("%.3lf\n",f[n]);
}
[BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包的更多相关文章
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5838 Solved: 2345[Submit][Sta ...
- BZOJ 1492: [NOI2007]货币兑换Cash 斜率优化 + splay动态维护凸包
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- BZOJ1492: [NOI2007]货币兑换Cash 【dp + CDQ分治】
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MB Submit: 5391 Solved: 2181 [Submit][S ...
- 【BZOJ 1492】 [NOI2007]货币兑换Cash 斜率优化DP
先说一下斜率优化:这是一种经典的dp优化,是OI中利用数形结合的思想解决问题的典范,通常用于优化dp,有时候其他的一些决策优化也会用到,看待他的角度一般有两种,但均将决策看为二维坐标系上的点,并转化为 ...
- BZOJ.1492.[NOI2007]货币兑换(DP 斜率优化 CDQ分治/Splay)
BZOJ 洛谷 如果某天能够赚钱,那么一定会在这天把手上的金券全卖掉.同样如果某天要买,一定会把所有钱花光. 那么令\(f_i\)表示到第\(i\)天所拥有的最多钱数(此时手上没有任何金券),可以选择 ...
- 洛谷P4027 [NOI2007]货币兑换(dp 斜率优化 cdq 二分)
题意 题目链接 Sol 解题的关键是看到题目里的提示... 设\(f[i]\)表示到第\(i\)天所持有软妹币的最大数量,显然答案为\(max_{i = 1}^n f[i]\) 转移为\(f_i = ...
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
- bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5541 Solved: 2228[Submit][Sta ...
随机推荐
- 漫谈单点登录(SSO)
1. 摘要 ( 注意:请仔细看下摘要,留心此文是否是您的菜,若浪费宝贵时间,深感歉意!!!) SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有!开 ...
- [转]掌握 Dojo 工具包,第 2 部分: XHR 框架与 Dojo
作者:secooler 快乐的DBA Ajax 的兴起改变了传统的 B/S 结构应用程序中以页面为单位的交互模式,Ajax 引入的局部刷新机制带来了更好的用户体验,促使浏览器中的页面开始向应用程序发展 ...
- [Java] 各种常用函数
1.writeInt()和readInt() 这两个函数并不是写入一个整数,读取一个整数.它们实际上是写入4个字节,读取4个字节. writeInt(int i)把i按四个字节,二进制形式写到输出流里 ...
- 【bzoj3043】IncDec Sequence 差分
题目描述 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一.问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下 ...
- 斜率dp+cdq分治
写在前面 这个东西应该是一个非常重要的套路......所以我觉得必须写点什么记录一下,免得自己忘掉了 一直以来我的斜率dp都掌握的不算很好......也很少主动地在比赛里想到 写这个的契机是noi.a ...
- BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap
一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...
- PHP代码优化小笔记
1.十万级以上次执行情况,方法可以被静态化,考虑声明为静态.html静态页面速度更快 2.echo 替换print:echo时逗号连接符替换点号连接符 3.循环之前设置循环最大次数,循环参数不要使用函 ...
- 一些常用的css片段
1. 单行文字溢出时省略号 .test{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } 2. 多行文字溢出时省略号 .t ...
- jquery中lhgdialog插件(一)
一:前言 最近在使用jquery的控件,其实以前也写但是突然之间遇到了需要从弹出窗口传值到父窗口,突然觉得这种传值的方式其实也是需要javascript的基础的,但是我自己还没有去真正的做过,所以还是 ...
- Spring - IoC(3): Bean 实例的创建方式
创建一个 Bean 实例对象的方法通常有如下方式: 调用构造器创建 Bean 实例 调用静态工厂方法创建 Bean 实例 调用实例工厂方法创建 Bean 实例 使用构造器创建 Bean 实例 XML ...