LOJ#2353 货币兑换

CDQ分治优化斜率优化DP。
有个结论就是每天买完卖完....知道这个之后考虑今天卖的是哪天买的就能写出n²DP了。
发现形式是fi = max(aibj + cidj)的形式。我们可以把ci除出来,就是斜率优化了。
然后发现横坐标和斜率全部没有单调性,于是CDQ分治搞一搞。
#include <bits/stdc++.h> const int N = ;
const long double eps = 1e-; long double a[N], b[N], c[N], R[N], f[N], s, k[N], v[N], w[N];
int n, node[N], t[N], stk[N], top; template <class T> inline void Max(T &a, const T &b) {
a < b ? a = b : ;
return;
} inline bool cmp_k(const int &a, const int &b) {
return k[a] < k[b];
} inline bool cmp_w(const int &a, const int &b) {
return w[a] < w[b];
} inline bool check(int a, int b, int c) {
if((v[b] - v[a]) * (w[c] - w[b]) + eps >= (v[c] - v[b]) * (w[b] - w[a])) {
return ;
}
return ;
} void CDQ(int l, int r) { //printf("CDQ : l = %d r = %d \n", l, r); if(l == r) {
if(r > ) f[r] *= b[r];
Max(f[r], f[r - ]);
v[r] = -f[r] / c[r];
w[r] = -v[r] * R[r];
//std::cout << "v[i] = " << v[r] << std::endl;
//printf("f = %.3f \n", f[r]);
return;
}
int mid = (l + r) >> ;
CDQ(l, mid); /// update
memcpy(t + l, node + l, (r - l + ) * sizeof(int));
std::sort(t + l, t + mid + , cmp_w);
std::sort(t + mid + , t + r + , cmp_k);
// build convex
stk[top = ] = t[l];
if(mid - l + >= ){
stk[++top] = t[l + ];
for(int i = l + ; i <= mid; i++) {
while(top > && check(stk[top - ], stk[top], t[i])) {
top--;
}
stk[++top] = t[i];
}
}
// update f
//printf("top = %d \n", top);
int head = ;
for(int i = mid + ; i <= r; i++) {
int x = t[i];
while(head < top && (v[stk[head]] - v[stk[head + ]]) / (w[stk[head]] - w[stk[head + ]]) + eps < k[x]) {
head++;
}
int y = stk[head];
//printf("Max %.3f %.3f * %.3f \n", f[x], -v[y], (R[y] * a[x] + b[x]));
//Max(f[x], -v[y] * (R[y] * a[x] + b[x]));
Max(f[x], w[y] * k[x] - v[y]);
} CDQ(mid + , r);
return;
} int main() { //freopen("in.in", "r", stdin);
//freopen("my.out", "w", stdout); scanf("%d%Lf", &n, &s);
for(int i = ; i <= n; i++) {
scanf("%Lf%Lf%Lf", &a[i], &b[i], &R[i]);
c[i] = a[i] * R[i] + b[i];
//std::cout << "c[i] = " << c[i] << std::endl;
k[i] = a[i] / b[i];
node[i] = i;
} f[] = s; CDQ(, n); printf("%.3Lf\n", f[n]);
return ;
}
AC代码
eps很重要...
LOJ#2353 货币兑换的更多相关文章
- loj#2353. 「NOI2007」 货币兑换 斜率优化
题意略 题解:可以列出dp方程\(dp[i]=max(dp[j]*{\frac{a[i]*c[j]+b[i]}{a[j]*c[j]+b[j]}}\),化简可以得到\(\frac{dp[i]}{b[i] ...
- LOJ 2353 & 洛谷 P4027 [NOI2007]货币兑换(CDQ 分治维护斜率优化)
题目传送门 纪念一下第一道(?)自己 yy 出来的 NOI 题. 考虑 dp,\(dp[i]\) 表示到第 \(i\) 天最多有多少钱. 那么有 \(dp[i]=\max\{\max\limits_{ ...
- loj2353. 「NOI2007」 货币兑换
loj2353. 「NOI2007」 货币兑换 链接 https://loj.ac/problem/2353 思路 题目不重要,重要的是最后一句话 提示 输入文件可能很大,请采用快速的读入方式. 必然 ...
- 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3396 Solved: 1434[Submit][Sta ...
- BZOJ 1492: [NOI2007]货币兑换Cash( dp + 平衡树 )
dp(i) = max(dp(i-1), x[j]*a[i]+y[j]*b[i]), 0<j<i. x, y表示某天拥有的最多钱去买金券, 金券a和金券b的数量. 然后就很明显了...平衡 ...
- bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5541 Solved: 2228[Submit][Sta ...
- [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086
额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
随机推荐
- vue嵌套路由
父组件 (注:to="/Flow/moban_a"这里不是文件加路径,是父组件路由+子组件路由) 路由配置
- 重写TreeView模板来实现数据分层展示(二)
前面一片文章实现TreeView的基本的模板重写,那么照着这个思路,我们再来写一个稍稍复杂的TreeView ,其它的内容都和前面系列内容相似,还是和之前文章介绍的一样,首先看看做出的DEMO的最终样 ...
- Lodop打印控件 如何打印虚线
Lodop提供了打印设计可以方便开发人员的开发,预览是打印的反显,可以显示出打印效果,但是在开发时,还是要用虚拟打印机实际测试,(win7以上系统可能自带xps虚拟打印机 Microsoft XPS ...
- sun.misc.BASE64Encoder----》找不到jar包的解决方法
1.右键项目->属性->java bulid path->jre System Library->access rules->resolution选择accessible ...
- Git简介及安装
1 Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码 ...
- JAVA优先级队列元素输出顺序测试
package code.test; import java.util.Comparator; import java.util.Iterator; import java.util.Priority ...
- python中的replace()方法的使用
python中的replace()方法的使用 需求是这样的:需要将字符串的某些字符替换成其他字符 str.replace(old,new,max) 第一个参数是要进行更换的旧字符,第二个参数是新的子串 ...
- C#版本和.NET版本以及VS版本的对应关系
C#版本和.NET版本以及VS版本的对应关系 版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual ...
- Python35安装
wnm系列之python安装 下载网址https://www.python.org/downloads/ 之前就用的3.5.4版本,这次还下这个 安装,我直接选择的install now 默认位置安装 ...
- MT【305】丹德林双球
如图.在正方体$ABCD-A_1B_1C_1D_1$中,点$M,N$分别是直线$CD,AB$上的动点,点$P$是$\Delta A_1C_1D_1$内的动点(不包括边界),记直线$DP$与$MN$所成 ...