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 货币兑换的更多相关文章

  1. 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] ...

  2. LOJ 2353 & 洛谷 P4027 [NOI2007]货币兑换(CDQ 分治维护斜率优化)

    题目传送门 纪念一下第一道(?)自己 yy 出来的 NOI 题. 考虑 dp,\(dp[i]\) 表示到第 \(i\) 天最多有多少钱. 那么有 \(dp[i]=\max\{\max\limits_{ ...

  3. loj2353. 「NOI2007」 货币兑换

    loj2353. 「NOI2007」 货币兑换 链接 https://loj.ac/problem/2353 思路 题目不重要,重要的是最后一句话 提示 输入文件可能很大,请采用快速的读入方式. 必然 ...

  4. 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治

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

  5. 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的数量. 然后就很明显了...平衡 ...

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

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

  7. [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

    额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...

  8. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  9. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

随机推荐

  1. SQL Server 2014备份维护计划

    1.      数据库 -> [管理]-> [维护计划]  -> [新建维护计划](如果没有操作过可以,选择“维护计划向导”): 2.      直接点击下一步,然后填写计划名称.说 ...

  2. 保存后自动格式化代码(vscode)

    痛点: 写项目的时候, 我们经常会拷贝一些代码, 每当拷贝过来都需要重新调整, 如果可以实现保存自动调整代码, 将会给我们带来很多的便利! 解决: 其实对于vscode来说, 实现这一点很容易. 我们 ...

  3. phpstorm显示页面不停的在indexing转圈中,并且文件名还一直在刷新

    打开 File下的 Invalidate Caches / Restart...下的 Invalidate and Restart. 便可以了 ......

  4. Java变量类型识别的3种方式

    内容导览 反射方式,成员变量的类型判断 isInstance用法 利用泛型识别类型 测试类: package com.cxyapi.oo; import java.util.Date; import ...

  5. MCV 和 MTV框架基本信息

    一 . MCV # web服务器开发最著名的MVC模式 M : model.py 就是和数据库打交道的, 创建表等操作 V : view 视图(视图函数,就是装HTML文件的) C : control ...

  6. python之路-字符串

    一.类型转换 a = 10 print(type(a)) # <class 'int'> d = str(a) # 把数字转换成str print(type(d)) # <class ...

  7. video maker & video tutorials

    video maker & video tutorials 视频课程制作工具 https://ke.qq.com/agency/personal/intro.html 成为网络老师 https ...

  8. 集合之LinkedHashSet(含JDK1.8源码分析)

    一.前言 上篇已经分析了Set接口下HashSet,我们发现其操作都是基于hashMap的,接下来看LinkedHashSet,其底层实现都是基于linkedHashMap的. 二.linkedHas ...

  9. 莫烦sklearn学习自修第八天【过拟合问题】

    1. 什么是过拟合问题 所谓过拟合问题指的是使用训练样本进行训练时100%正确分类或规划,当使用测试样本时则不能正确分类和规划 2. 代码实战(模拟过拟合问题) from __future__ imp ...

  10. 二、启用Docker支持

    一.使用