第一次打动态凸包维护dp,感觉学到了超级多的东西。

首先,set是如此的好用!!!可以通过控制一个flag来实现两种查询,维护凸包和查找斜率k

不过就是重载运算符和一些细节方面有些恶心,90行解决

后面还有一个cdq分治,找时间学下,看下能不能处理一大类恶心的问题

github还是不会用,找时间搞下吧

CODE:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<set>
 6 #include<cmath>
 7 using namespace std;
 8 const double esp=1e-7;
 9 const int maxn=101000;
10 int dcmp(double a) {
11     if (fabs(a)<esp) return 0;
12     return a<0?-1:1;
13 }
14 struct node{
15     double x,y,k;bool f;
16     node(double _x,double _y):x(_x),y(_y),f(0){}
17     node():f(0){}
18     inline bool error(){return x>1e50;}
19 }error(1e51,0);
20 inline bool operator == (const node x,const node y) {return dcmp(x.x-y.x)==0;}
21 inline bool operator < (const node x,const node y){
22     if (x.f||y.f) return dcmp(x.k-y.k)>0;
23     else return dcmp(x.x-y.x)<0;
24 }
25 inline double operator *(const node x,const node y) {return x.x*y.y-x.y*y.x;}
26 inline node operator -(const node x,const node y){
27     node tmp;
28     tmp.x=x.x-y.x;tmp.y=x.y-y.y;
29     return tmp;
30 }
31 inline double calc_k(node x,node y) {return (x.y-y.y)/(x.x-y.x);}
32 set<node> gap;
33 typedef set<node>::iterator iter;
34 inline node lower(node x) {
35    iter it=gap.lower_bound(x);
36    return it==gap.end()?error:*it;
37 }
38 inline node next(node x) {
39     iter it=gap.upper_bound(x);
40     return it==gap.end()?error:*it;
41 }
42 inline node pre(node x) {
43     iter it=gap.lower_bound(x);
44     return it==gap.begin()?error:*(--it);
45 }
46 inline void ins(node a) {
47     if (gap.empty()) {a.k=0;gap.insert(a);return;}
48     node d1=pre(a),d2=lower(a);
49     if (d1.error()&&d2.y>a.y) return ;
50     if ((!d1.error())&&(!d2.error())&&(dcmp((d2-d1)*(a-d1))<=0)) return ;
51     if (d2==a) return;
52     node p1,p2=next(a);
53     for (;;){
54         p1=p2;p2=next(p2);
55         if (p1.error()||p2.error()) break;
56         if (dcmp((p1-a)*(p2-a))<=0) break;
57         gap.erase(p1);
58     }
59     p2=pre(a);
60     for (;;){
61         p1=p2;p2=pre(p2);
62         if (p1.error()||p2.error()) break;
63         if (dcmp((p1-a)*(p2-a))>=0) break;
64         gap.erase(p1);
65     }
66     d1=pre(a),d2=next(a);
67     if (d1.error()) a.k=0;else a.k=calc_k(d1,a);gap.insert(a);
68     if (!d2.error()) gap.erase(d2),d2.k=calc_k(a,d2),gap.insert(d2);
69 }
70 inline double get_k(double a,double b) {
71     node tmp;tmp.f=1;tmp.k=-a/b;
72     tmp=*(--gap.lower_bound(tmp));
73     return a*tmp.x+b*tmp.y;
74 }
75 double a[maxn],b[maxn],r[maxn],na[maxn],nb[maxn],f[maxn];
76 int main(){
77     int n,s;
78     scanf("%d%d",&n,&s);
79     for (int i=1;i<=n;i++) scanf("%lf%lf%lf",a+i,b+i,r+i);
80     f[1]=s;
81     nb[1]=f[1]/(a[1]*r[1]+b[1]);
82     na[1]=nb[1]*r[1];
83     ins(node(na[1],nb[1]));
84     for (int i=2;i<=n;i++) {
85         f[i]=max(f[i-1],get_k(a[i],b[i]));
86         nb[i]=f[i]/(a[i]*r[i]+b[i]);
87         na[i]=nb[i]*r[i];
88         ins(node(na[i],nb[i]));
89     }
90     printf("%.3f\n",f[n]);
91 }
92     

  

转载于:https://www.cnblogs.com/New-Godess/p/4354675.html

[NOI2007]货币兑换Cash(DP+动态凸包)相关推荐

  1. 【bzoj 1492】【codevs 1797】 [NOI2007]货币兑换Cash (dp+cdq分治)

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

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

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

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

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

  4. 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治

    [BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...

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

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

  6. [NOI2007] 货币兑换 (dp+李超树维护凸包)

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

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

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

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

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

  9. bzoj 1492: [NOI2007]货币兑换Cash

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

最新文章

  1. hibernate Disabling contextual LOB creation as connection was null
  2. (转)响应式Web设计是大势所趋还是时代的产物
  3. python 轮廓矩阵_python – 在3D numpy矩阵中绘制给定值的曲面轮廓
  4. 【2016年第3期】大数据治理的数据模式与安全
  5. html工作界面抽象吗,WEB界面设计五种特征-网页设计,HTML/CSS
  6. Android TouchEvent事件传递机制
  7. cad填充密度怎么调整_CAD填充技巧之填充比例
  8. 2022 Java IDEA 安装导入JDBC驱动
  9. python自动答题助手_头脑王者python答题助手
  10. 《人类简史-从动物到上帝》读后感
  11. 数据库服务器文件路径,服务器数据库的文件路径
  12. 【Linux】进程状态
  13. 什么是同源策略?解决跨域的三种方法?
  14. 泡泡玛特市值千亿背后,我们为什么会为盲盒买单?
  15. 爪哇国政府有个绑架局
  16. 标贝科技|智能语音助手+全息形象,会是下一个趋势吗
  17. 格式塔理论主要是用计算机,格式塔理论在UI设计中的运用
  18. 制作PDF模板实现PDF文件生成
  19. linux 搭建游戏服务器,Linux系统下玩经典游戏 CS1.5服务器架设
  20. 数据猿·金猿榜丨2017中国智能营销域最具潜力创业公司

热门文章

  1. 从小部件的调整入手,AI 让你秒变时尚达人
  2. CentOS7 0安装Maven
  3. (1)51单片机NOP指令
  4. AspNetPager 样式以及使用(漂亮)
  5. flash TweenMax用法
  6. 企业IT解决方案经验分享活动
  7. Ubuntu 11.10 安装Adobe Air 和卸载Air中的软件
  8. iOS中的CADisplayLink定时器
  9. 重新理解 Monad
  10. 思科——RIP的运用