CDQ分治优化斜率优化DP。

有个结论就是每天买完卖完....知道这个之后考虑今天卖的是哪天买的就能写出n²DP了。

发现形式是fi = max(aibj + cidj)的形式。我们可以把ci除出来,就是斜率优化了。

然后发现横坐标和斜率全部没有单调性,于是CDQ分治搞一搞。

 1 #include <bits/stdc++.h>
 2
 3 const int N = 1000010;
 4 const long double eps = 1e-12;
 5
 6 long double a[N], b[N], c[N], R[N], f[N], s, k[N], v[N], w[N];
 7 int n, node[N], t[N], stk[N], top;
 8
 9 template <class T> inline void Max(T &a, const T &b) {
10     a < b ? a = b : 0;
11     return;
12 }
13
14 inline bool cmp_k(const int &a, const int &b) {
15     return k[a] < k[b];
16 }
17
18 inline bool cmp_w(const int &a, const int &b) {
19     return w[a] < w[b];
20 }
21
22 inline bool check(int a, int b, int c) {
23     if((v[b] - v[a]) * (w[c] - w[b]) + eps >= (v[c] - v[b]) * (w[b] - w[a])) {
24         return 1;
25     }
26     return 0;
27 }
28
29 void CDQ(int l, int r) {
30
31     //printf("CDQ : l = %d r = %d \n", l, r);
32
33     if(l == r) {
34         if(r > 1) f[r] *= b[r];
35         Max(f[r], f[r - 1]);
36         v[r] = -f[r] / c[r];
37         w[r] = -v[r] * R[r];
38         //std::cout << "v[i] = " << v[r] << std::endl;
39         //printf("f = %.3f \n", f[r]);
40         return;
41     }
42     int mid = (l + r) >> 1;
43     CDQ(l, mid);
44
45     /// update
46     memcpy(t + l, node + l, (r - l + 1) * sizeof(int));
47     std::sort(t + l, t + mid + 1, cmp_w);
48     std::sort(t + mid + 1, t + r + 1, cmp_k);
49     // build convex
50     stk[top = 1] = t[l];
51     if(mid - l + 1 >= 2){
52         stk[++top] = t[l + 1];
53         for(int i = l + 2; i <= mid; i++) {
54             while(top > 1 && check(stk[top - 1], stk[top], t[i])) {
55                 top--;
56             }
57             stk[++top] = t[i];
58         }
59     }
60     // update f
61     //printf("top = %d \n", top);
62     int head = 1;
63     for(int i = mid + 1; i <= r; i++) {
64         int x = t[i];
65         while(head < top && (v[stk[head]] - v[stk[head + 1]]) / (w[stk[head]] - w[stk[head + 1]]) + eps < k[x]) {
66             head++;
67         }
68         int y = stk[head];
69         //printf("Max %.3f  %.3f * %.3f \n", f[x], -v[y], (R[y] * a[x] + b[x]));
70         //Max(f[x], -v[y] * (R[y] * a[x] + b[x]));
71         Max(f[x], w[y] * k[x] - v[y]);
72     }
73
74     CDQ(mid + 1, r);
75     return;
76 }
77
78 int main() {
79
80     //freopen("in.in", "r", stdin);
81     //freopen("my.out", "w", stdout);
82
83     scanf("%d%Lf", &n, &s);
84     for(int i = 1; i <= n; i++) {
85         scanf("%Lf%Lf%Lf", &a[i], &b[i], &R[i]);
86         c[i] = a[i] * R[i] + b[i];
87         //std::cout << "c[i] = " << c[i] << std::endl;
88         k[i] = a[i] / b[i];
89         node[i] = i;
90     }
91
92     f[1] = s;
93
94     CDQ(1, n);
95
96     printf("%.3Lf\n", f[n]);
97     return 0;
98 }

AC代码

eps很重要...

转载于:https://www.cnblogs.com/huyufeifei/p/10547190.html

LOJ#2353 货币兑换相关推荐

  1. LOJ 2721 「NOI2018」屠龙勇士——扩展中国剩余定理

    题目:https://loj.ac/problem/2721 1.注意别一输入 p[ i ] 就 a[ i ] %= p[ i ] ,因为在 multiset 里找的时候还需要真实值. 2.注意用 m ...

  2. 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)

    题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...

  3. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  4. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  5. Loj #6287 诗歌

    link: https://loj.ac/problem/6287 一开始差点写FFT了23333,并且FFT还能算这样的三元组的数量而且还不用要求这是一个排列.... 但这太大材小用了(而且很可能被 ...

  6. [LOJ 6288]猫咪[CF 700E]Cool Slogans

    [LOJ 6288]猫咪[CF 700E]Cool Slogans 题意 给定一个字符串 \(T\), 求一个最大的 \(K\) 使得存在 \(S_1,S_2,\dots,S_k\) 满足 \(S_1 ...

  7. Loj #2036. 「SHOI2015」自动刷题机

    link : https://loj.ac/problem/2036 这个显然具有单调性,N小的话更容易A题,不仅因为A一次题减少的代码,并且A题的下限也低. 所以直接上二分就行了,注意上限一定不要设 ...

  8. LOJ 3094 「BJOI2019」删数——角标偏移的线段树

    题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移 ...

  9. Loj 6485. LJJ 学二项式定理

    Loj 6485. LJJ 学二项式定理 题目描述 LJJ 学完了二项式定理,发现这太简单了,于是他将二项式定理等号右边的式子修改了一下,代入了一定的值,并算出了答案. 但人口算毕竟会失误,他请来了你 ...

最新文章

  1. 简单的面试题简解思路(搜集)
  2. 【无标题】物联网安全挑战:为什么企业现在必须评估它们
  3. 云钻还在吗 苏宁怎么解除实名认证_快手7天怎么养号,5步简易养号方案送上
  4. PhpStorm下Laravel代码智能提示
  5. mysql命令成功数值不变_MySQL基础知识精华汇总_3(mysql基础命令操作)
  6. React Native之APK文件签名及打包
  7. vscode使用教程-开始学习前端开发啦~
  8. 网页游戏是如何快速推广,寻找真实玩家。提高充值消费的。这里都有教程
  9. vue调用摄像头pc+移动端
  10. 线程的状态及状态转换
  11. 从码农到工程师:只要做到这6点
  12. 银行客户违约信息分析(数据挖掘)
  13. vue 重写element input限制字数
  14. Java对接云mas发送短信(https方式)
  15. JSP用户登录连接数据库
  16. (转载)constnbsp;charnbsp;*amp;nbs…
  17. QDateTime相关格式
  18. 北大方正集团收入突破千亿,在中国企业500强排名提升24位
  19. Problems and Solutions
  20. GPS软件接收机(1)——GPS信号捕获

热门文章

  1. php通用的树型类创建无限级树型菜单
  2. HASH暴力破解工具-Hashcat
  3. 移动端触摸移动小demo
  4. 使用连接来代替in和not in(使用外连接技巧)
  5. java面试和笔试大全
  6. DLL内线程同步主线程研究(子线程代码放到主线程执行)
  7. MS10-002紧急补丁将在美国太平洋时间上午10点左右发布
  8. 永远的GetLong
  9. navigator对象介绍
  10. java实现js取反_特定位取反(js实现)