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

推荐博客:http://www.cnblogs.com/zig-zag/archive/2013/04/24/3039418.html

保存cdq分治模版代码。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath> const int maxn = 100005;
const double eps = 1e-9, inf = 1e300; int n, s;
double a[maxn], b[maxn], rate[maxn], f[maxn]; struct point {
double x, y;
int id;
bool operator<(const point & rhs) const {
if (fabs(x - rhs.x) < eps) {
return y > rhs.y + eps;
}
return x + eps < rhs.x;
}
} stk[maxn], p[maxn], np[maxn];
struct query {
double k;
int id;
} q[maxn], tq[maxn]; bool cmp(const query & aa, const query & ss) {
return aa.k > ss.k;
}
inline double getk(const point & aa, const point & ss) {
if (fabs(aa.x - ss.x) < eps) {
return -inf;
}
return (ss.y - aa.y) / (ss.x - aa.x);
} void slove(int left, int right) {
if (left == right) {
f[left] = std::max(f[left], f[left - 1]);
p[left].y = f[left] / (a[left] * rate[left] + b[left]);
p[left].x = p[left].y * rate[left];
return;
} int mid = (left + right) >> 1, idx1 = left, idx2 = mid + 1;
for (int i = left; i <= right; ++i) {
if (q[i].id <= mid) {
tq[idx1++] = q[i];
}
else {
tq[idx2++] = q[i];
}
}
memcpy(q + left, tq + left, sizeof(query) * (right - left + 1)); slove(left, mid); int top = 0;
stk[top++] = p[left];
for (int i = left + 1; i <= mid; ++i) {
while (top > 1 && getk(p[i], stk[top - 1]) > getk(stk[top - 1], stk[top - 2]) + eps) {
--top;
}
stk[top++] = p[i];
} int j = 0;
for (int i = mid + 1; i <= right; ++i) {
while (j < top - 1 && getk(stk[j], stk[j + 1]) > q[i].k + eps) {
++j;
}
f[q[i].id] = std::max(f[q[i].id], stk[j].x * a[q[i].id] + stk[j].y * b[q[i].id]);
} slove(mid + 1, right); idx1 = left, idx2 = mid + 1;
for (int i = left; i <= right; ++i) {
if (idx1 <= mid && (p[idx1] < p[idx2] || idx2 > right)) {
np[i] = p[idx1++];
}
else {
np[i] = p[idx2++];
}
}
memcpy(p + left, np + left, sizeof(point) * (right - left + 1));
} int main(void) {
scanf("%d%d", &n, &s);
f[0] = (double)s;
for (int i = 1; i <= n; ++i) {
scanf("%lf%lf%lf", a + i, b + i, rate + i);
q[i] = (query){-a[i] / b[i], i};
} std::sort(q + 1, q + n + 1, cmp);
slove(1, n);
printf("%.3lf\n", f[n]);
return 0;
}

  

bzoj1492 [NOI2007]货币兑换Cash【cdq分治】的更多相关文章

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

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

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

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

  3. BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)

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

  4. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  5. BZOJ 1492 [NOI2007]货币兑换Cash (CDQ分治/splay 维护凸包)

    题目大意:太长了略 splay调了两天一直WA弃疗了 首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖 反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了 容易 ...

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

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

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

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

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

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

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

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

随机推荐

  1. git项目.gitignore文件不生效解决办法

    配置好.gitignore文件如下: HELP.md /target/ !.mvn/wrapper/maven-wrapper.jar ### STS ### .apt_generated .clas ...

  2. [CPP - STL] functor刨根问底儿

    作为STL六大组件之一,在STL源代码及其应用中,很多地方使用了仿函数(functor),尤其在关联型容器(如set.map)以及algorithm(如find_if.count_if等)中.虽然已经 ...

  3. java 接口自动化测试之数据请求的简单封装

    我们自己用java写接口自动化测试框架或者做个接口自动化测试平台的话,是需要自己进行相关的请求的,因此我们需要简单的封装下httpclient,我新建了一个http工具类,将get方法和post方法进 ...

  4. 使用libcurl进行HTTP GET操作

    Working example how to do a GET request with libcurl and save it to a string variable for future use ...

  5. poj图论解题报告索引

    最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...

  6. 关于使用response.addHeader下载中文名乱码问题

    介绍下我项目中遇到的问题:在数据库导出Excel文件的过程中,导出文件中文名始终异常,最终结果发现需要在response.addHeader 中的 filename = "xxxx" ...

  7. 「LuoguP1379」 八数码难题(迭代加深

    [P1379]八数码难题 - 洛谷 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种 ...

  8. MongoDB安装及多实例启动

    MongoDB安装及多实例启动 MongoDB简介 MongoDB是一款跨平台.面向文档的数据库.可以实现高性能.高可用性,并且能够轻松扩展,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下 ...

  9. C++模板之函数模板实例化和具体化

    模板声明 template<typename/class T>,  typename比class最近后添加到C++标准. 常规模板,具体化模板,非模板函数的优先调用顺序. 非模板函数(普通 ...

  10. bzoj 2083 [Poi2010]Intelligence test——思路+vector/链表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2083 给每个值开一个vector.每个询问挂在其第一个值上:然后枚举给定序列,遇到一个值就访 ...