[BZOJ1492][NOI2007]cash-[cdq分治]】的更多相关文章

首先,设f[x]表示x天能获得的A券最大值,有动规方程: $f[i]=max\{f[j]*A[i]+f[j]*B[i]/R[j]\}*R[i]/(R[i]*A[i]+B[i])$, 设 $j<k$ ,$f[j]>f[k]$ $\Rightarrow (f[j]/R[j]-f[k]/R[k])/(f[j]-f[k]) \leftarrow A[i]/B[i]$ 令$g[i]=f[i]/R[i]$,则有$(g[j]-g[k])/(f[j]-f[k]) \leftarrow A[i]/B[i]$ 将…
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有的金券. 设dp[i]表示第i天卖出所有金券的能够得到的钱数.则有: \[dp[i]=max(dp[i-1],\frac{dp[j]}{A[j] \times R[j]+B[j] } \times (A[i] \times R[j]+B[i])) (0 \leq j < i)\] 意义是第j天按R[…
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5541  Solved: 2228[Submit][Status][Discuss] Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个实数.每天随着市场的起伏波动, 两种金券都有自己当时的价值,即每一单位金…
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[i]$表示第$i$天最多能得到的钱在这一天可以换成多少$A$卷 枚举使用哪一天留下的卷,按这一天的汇率换成钱来更新最大钱数 再用这个钱数更新$f[i]$ 这样是$O(n^2)$的 #include <iostream> #include <cstdio> #include <al…
题目大意:太长了略 splay调了两天一直WA弃疗了 首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖 反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了 容易得到方程 $dp[i]=max(dp[i-1],a[i]*\frac{dp[j]*rate[j]}{rate[j]*a[j]+b[j]}+b[i]*\frac{dp[j]}{rate[j]*a[j]+b[j]})$ 显然是要用凸优化了 splay非常无脑,splay维护此题的凸包,需要找前驱,删前驱…
[NOI2007]货币兑换 LG传送门 妥妥的\(n \log n\)cdq做法. 这题用cdq分治也可以\(n \log n\)但是在洛谷上竟然比一些优秀的splay跑得慢真是见了鬼了看来还是人丑常数大的问题 先推式子 (这一段与其他题解不会有太多不同,已经了解了的同学可以略过,注意一下转移中\(x\)和\(k\)表示什么就行了.) 设\(f[i]\)表示到第\(i\)天最多有多少钱,\(g[i]\)表示用第\(i\)天时的钱最多能买多少B券,易知\(g[i] = \frac {f[i]} {…
这题n2算法就是一个维护上凸包的过程. 也可以用CDQ分治做. 我的CDQ分治做法和网上的不太一样,用左边的点建立一个凸包,右边的点在上面二分. 好处是思路清晰,避免了凸包的插入删除,坏处是多了一个log. 这题数据很水,同时注意精度. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<ctime&…
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个实数.每天随着市场的起伏波动, 两种金券都有自己当时的价值,即每一单位金券当天可以兑换的人民币数目.我们记录第 K 天中 A券 和 B券 的 价值分别为 AK 和 BK(元/单位金券).为了方便顾客,金券交易所提供了一种非常方便的交易方式:比例交易法 .比例交易法分为两个方面:(a)卖出金券:顾客提…
斜率在转移顺序下不满足单调性的斜率优化\(DP\),用动态凸包来维护.送命题. 简化版题意:每次在凸包上插入一个点,以及求一条斜率为\(K\)的直线与当前凸包的交点.思路简单实现困难. \(P.s\),不是特别建议用\(Set\)来维护动态凸包,万一中间哪一点功能实现\(STL\)没有提供就\(GG\)了.(比如要有两种比较运算符.)本人因此重构了三次\(:)\) 代码来源:黄学长的代码的魔改版. #include <bits/stdc++.h> using namespace std; co…
#include <stdio.h> #include <bitset> #include <string.h> #include <stack> #include <algorithm> #include <iostream> #include <set> #include <map> #include <math.h> #include <queue> #include <co…