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天卖掉,或者是不 ...
随机推荐
- 需要注意的一些Mysql语句
1. 日期处理函数:date_format() select COUNT(*) from (SELECT SERIAL_NO, APPLY_SERIAL_NO, FLAG, PAY_DATE, SEQ ...
- ubuntu下安装android模拟器genymotion【转】
本文转载自:http://www.jianshu.com/p/e6062ebb8fc9 去genymotion下载对应的安装包genymotion-2.4.0_x64.bin sudo ./genym ...
- 闪动的Label控件
带闪动效果带控件,目前只有Label,以后会逐步增加,如果有好看带效果也欢迎您带加入. 如果可能,请在github中star,您的支持是我继续完善的动力,非常感谢. 测试环境:Xcode 5.0,iO ...
- codeforces B. Ciel and Flowers 解题报告
题目链接:http://codeforces.com/problemset/problem/322/B 题目意思:给定红花.绿花和蓝花的朵数,问组成四种花束(3朵红花,3朵绿花,3朵蓝花,1朵红花+1 ...
- linux应用之tomcat的安装及配置(centos)
CentOS 6.6下安装配置Tomcat环境 [日期:2015-08-25] 来源:Linux社区 作者:tae44 [字体:大 中 小] 实验系统:CentOS 6.6_x86_64 实验前 ...
- albus就是要第一个出场(线性基)
传送门 这个题题目描述真怪异--就不能说人话吗-- 人话:给定长为n的序列A,定义f(s)为集合s内所有元素异或值,求A的所有子集的f值从小到大排列后,q在其中第一次出现的下标对10086取模的值. ...
- HDU2639(01背包第K大)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- vue 使用scss报错
vue-cli默认没有scss-loader,需要安装依赖:sass-loader node-sass 安装之后重启就可以使用: <style lang="scss"> ...
- Interval query
题意: 给出数轴上的N个区间,M个询问"QUERY(a, b)", 意为[a, b]之间不相交的集合的最大数量是多少. 解法: 考虑 $O(n)$ 的贪心做法,预处理出对于每一个位 ...
- Ubuntu下对与rtl8723be网卡频繁断网问题解决
linux下对于rtl系列的无线网卡,大多数网友都在吐槽,总是频繁的掉网,就此将自己在网上安装时的经验写下. 1.下载网卡驱动,其中包含rtl的大多数包 sudo apt-get install li ...