bzoj1492 [NOI2007]货币兑换Cash【cdq分治】
传送门: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分治】的更多相关文章
- [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 ...
- BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- BZOJ 1492 [NOI2007]货币兑换Cash (CDQ分治/splay 维护凸包)
题目大意:太长了略 splay调了两天一直WA弃疗了 首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖 反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了 容易 ...
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5838 Solved: 2345[Submit][Sta ...
- BZOJ1492: [NOI2007]货币兑换Cash 【dp + CDQ分治】
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MB Submit: 5391 Solved: 2181 [Submit][S ...
- [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5907 Solved: 2377[Submit][Sta ...
- bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...
随机推荐
- [usaco2009nov]奶牛的图片
Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片,这样他就可以向他的朋友炫耀他的奶牛.这N只奶牛被标号为1..N.在照相的那一天,奶牛们排成了一排.其中第i个位 ...
- 如何刷新本地的DNS缓存?
为了提高网站的访问速度,系统会在成功访问某网站后将该网站的域名.IP地址信息缓存到本地.下次访问该域名时直接通过IP进行访问.一些网站的域名没有变化,但IP地址发生变化,有可能因本地的DNS缓存没有刷 ...
- 网页兼容性测试(工具使用IETESTER、Firefox、360安全浏览器)
网页兼容性测试主要是针对不同的浏览器进行的测试.由于用户浏览器的不同,往往都会使我们的网页发生页面样式错乱,图片无法显示等问题.对于前端开发工程师来说,确保代码在各种主流浏览器的各个版本中都能正常显示 ...
- PDF在线预览 (flexpaper+swftools+saveaspdfandxps)
1.使用SaveAsPDFandXPS将office文档转换成PDF http://www.microsoft.com/downloads/details.aspx?FamilyID=4d951911 ...
- HDU1852 Beijing 2008(快速幂+特殊公式)
As we all know, the next Olympic Games will be held in Beijing in 2008. So the year 2008 seems a lit ...
- 「LuoguP3379」 【模板】最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- P1014 Cantor表
洛谷 p1014 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2 ...
- 编译生成的h.gch文件是什么鬼?
所谓预编译头,就是把头文件事先编译成一种二进制的中间格式,供后续的编译过程使用.GCC编译头文件后的中间文件是*.gch. 如何将头文件编译为.gch文件呢?用g++编译,格式: g++ xxx.h ...
- C++之引用&的详解
C++中的引用: 引用引入了对象的一个同义词.定义引用的表示方法与定义指针相似,只是用&代替了*.引用(reference)是c++对c语言的重要扩充.引用就是某一变量(目标)的一个别名,对引 ...
- 洛谷P1967货车运输——倍增LCA
题目:https://www.luogu.org/problemnew/show/P1967 就是倍增LCA的裸题,注意一些细节即可. 代码如下: #include<iostream> # ...