Description

搓我

Solution

容易列出方程:
t=max(dpjai+dpj/rtj×bi)t=max(dpjai+dpj/rtj×bi)t=max(dp_ja_i+dp_j/rt_j\times b_i)
dpi=t×rti/(ai×rti+bi)dpi=t×rti/(ai×rti+bi)dp_i=t\times rt_i/(a_i\times rt_i+b_i)

然后可以将其用斜率表示出来,发现并不具有单调性,然后CDQ分治即可。

第一次打用CDQ分治解决斜率优化DP的题目,感觉代码实现还是有很多细节的,参考了hzwer的代码。。

Source

有dalao知道为什么代码的NOTICE处没有加eps就会WA吗。。
我还是太菜了。。。

/************************************************* Au: Hany01* Date: Mar 16th, 2018* Prob: [BZOJ1492][NOI2007] Cash* Email: hany01@foxmail.com
************************************************/#include<bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
#define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i)
#define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)
#define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)
#define Set(a, b) memset(a, b, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define fir first
#define sec second
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) ((int)(a).size())
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define Mod (1000000007)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define y1 wozenmezhemecaiatemplate <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }inline int read()
{register int _, __; register char c_;for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1;for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}inline void File()
{
#ifdef hany01freopen("bzoj1492.in", "r", stdin);freopen("bzoj1492.out", "w", stdout);
#endif
}const int maxn = 100005;
const double eps = 1e-8;int n, stk[maxn], top;
double f[maxn];struct Data {double a, b, sl, x, y, rt;int id;bool operator < (const Data& A) const { return sl > A.sl; }
}A[maxn], t[maxn];inline double getdp(double t, int i) { return t * A[i].rt / (A[i].a * A[i].rt + A[i].b); }inline double Slope(int x, int y) {if (!y) return -1e20;if (fabs(A[y].x - A[x].x) < eps) return 1e20;return (A[y].y - A[x].y) / (A[y].x - A[x].x);
}void CDQ(int l, int r)
{//The bottomif (l == r) {chkmax(f[l], f[l - 1]);A[l].x = getdp(f[l], l), A[l].y = A[l].x / A[l].rt;return ;}//Divide them into 2 partsint mid = (l + r) >> 1, x = l, y = mid + 1, cur = 1;For(i, l, r)if (A[i].id <= mid) t[x ++] = A[i]; else t[y ++] = A[i];For(i, l, r) A[i] = t[i];//Deal with the left partCDQ(l, mid);//Get the convex line of the left pointstop = 0;For(i, l, mid) {//We can build the convex line directly because we have sort them before(At the last of this function)while (top > 1 && Slope(stk[top - 1], stk[top]) < Slope(stk[top - 1], i) + eps) -- top;//NOTICE: The '+ eps' is necessary or you will get only 80 pointsstk[++ top] = i;}stk[++ top] = 0;//To deal with the dicision on the last element//Update the right part with the convex lineFor(i, mid + 1, r) {while (cur < top && Slope(stk[cur], stk[cur + 1]) > A[i].sl) ++ cur;chkmax(f[A[i].id], A[stk[cur]].x * A[i].a + A[stk[cur]].y * A[i].b);}//Deal with the right partCDQ(mid + 1, r);//Sort according to xx = l, y = mid + 1;For(i, l, r)if (x == mid + 1) t[i] = A[y ++];else if (y == r + 1) t[i] = A[x ++];else if (A[x].x < A[y].x || (A[x].x - A[y].x < eps && A[x].y < A[y].y)) t[i] = A[x ++];else t[i] = A[y ++];For(i, l, r) A[i] = t[i];
}int main()
{File();n = read(), f[0] = read();For(i, 1, n)scanf("%lf%lf%lf", &A[i].a, &A[i].b, &A[i].rt),A[i].sl = -A[i].a / A[i].b, A[i].id = i;sort(A + 1, A + 1 + n);CDQ(1, n);printf("%.3lf\n", f[n]);return 0;
}
//山外青山楼外楼,西湖歌舞几时休?
//    -- 林升《题临安邸》

【BZOJ1492】【NOI2007】货币兑换 Cash(CDQ分治,斜率优化)相关推荐

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

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

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

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

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

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

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

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

  5. bzoj1492 [NOI2007]货币兑换Cash (斜率DP+cdq分治)

    题意:到处都找得到. 我没看错的话当年考试的时候的题面里头,是提示了买卖一定是全部买入和卖出的.这样一来就好办了.cdq的论文里面那个F并不是她所说的那样,而是就是那个最优值.方程转移的时候实际上是枚 ...

  6. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  7. 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化

    [BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...

  8. bzoj1492: [NOI2007]货币兑换Cash

    码了我两个星期的题啊,终于写完了,感觉一半的时间都在调splay,后面写cdq好像轻松一点,cdq码量小一倍,而且又好想(可能是我调的时候理解了)感觉这种黑科技很nb,关键是可以减少细节出错(像我这种 ...

  9. CF932F-Escape Through Leaf【树上启发式合并,CDQ分治,斜率优化dp】

    正题 题面链接:https://www.luogu.com.cn/problem/CF932F 题目大意 nnn个点的一棵树,从xxx跳到yyy(要求yyy在xxx的子树中)会产生Ax∗ByA_x*B ...

  10. bzoj1492 NOI2007 货币兑换Cash

    题目描述 题解: 题目都提示了, 很明显要导一波式子: $$dp[i]=max( dp[i-1] , \frac{ dp[j] } { A[j]*R[j]+B[j] } * (A[i]*R[j]+B[ ...

最新文章

  1. docker~dockertoolbox的加速器
  2. linux2.6内核链表
  3. Java 8 - 04 类型检查、类型推断以及限制
  4. 【PAT乙级】1034 有理数四则运算 (20 分)
  5. 面试官:缓存穿透、缓存雪崩和缓存击穿是什么?
  6. vc 基于对话框实现工具条提示显示
  7. Vmare 15 安装 macOS 15.5 的关键步骤
  8. 电脑pin重置_如果忘记了如何重置Windows PIN
  9. Android之实现多张图片点击预览(支持放缩)和滑动
  10. js调用vlc_如何使用HTML5或JavaScript查看RTSP流,而不使用Real Player插件上的VLC插件等插件?...
  11. windows linux cpu 抢占式 时间片_阿里技术专家谈:CPU飙高,系统性能问题如何排查?...
  12. 云垒·私有云一体化安全管理平台
  13. php运行环境出现Undefined index 或variable时解决方法
  14. Opencv 视频转为图像序列
  15. ttl接地是高电平还是低电平_TTL 门电路输入端分别接大电阻接地,小电阻接地,或空接,输入的是什么电平???跟是什么类型的门电路......
  16. 重构Webpack系列之四 ---- Loaders
  17. cs231n softmax作业笔记
  18. moxa串口服务器网页版用户名密码,moxa串口服务器设置密码
  19. 2022广东省安全员A证第三批(主要负责人)考试题库及在线模拟考试
  20. 华强盛HQST推出传输速度高达10Gbit/s网络变压器

热门文章

  1. 【统计学】英文概念之Mean和Average的区别
  2. 【matlab学习】用matlab编写简单程序(入门)
  3. 51nod1212无向图最小生成树
  4. SPSS-非参数检验
  5. 基于开源的BPM流程引擎VS天翎自研BPM流程引擎
  6. 轻量型目标检测算法一次看个够
  7. 福利:推荐一个免费的抠图网站
  8. 使用EasyUI固定表格的行或列
  9. 【校内互侧】ZYF loves qaq (找规律+递推)
  10. 使用Excel生成符合正态分布的随机数