题意略

题解:可以列出dp方程\(dp[i]=max(dp[j]*{\frac{a[i]*c[j]+b[i]}{a[j]*c[j]+b[j]}}\),化简可以得到\(\frac{dp[i]}{b[i]}=\frac{a[i]}{b[i]}*\frac{dp[j]*c[j]}{a[j]*c[j]+b[j]}+\frac{dp[j]}{a[j]*c[j]+b[j]}\),就变成了y=kx+b的形式,能cdq分治维护,也能set维护动态凸包

cdq:

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define ld long double
//#define C 0.5772156649
//#define ls l,m,rt<<1
//#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define ull unsigned long long
//#define base 1000000000000000000
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;} using namespace std; const ull ba=233;
const db eps=1e-5;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=100000+10,maxn=100000+10,inf=0x3f3f3f3f; ld a[N],b[N],c[N],dp[N];
struct info{
ld x,y;int id;
bool operator <(const info&rhs)const{
return x<rhs.x||(x==rhs.x&&y<rhs.y);
}
}d[N];
struct hull{
int head,last,q[N];
void init(){head=1,last=0;}
ld X(int i){return dp[i]*c[i]/(a[i]*c[i]+b[i]);}
ld Y(int i){return dp[i]/(a[i]*c[i]+b[i]);}
ld cal(int i,ld k){return Y(i)-k*X(i);}
bool check(int a,int b,int c)
{
return (Y(b)-Y(a))*(X(c)-X(b))<=(Y(c)-Y(b))*(X(b)-X(a));
}
void update(int id)
{
if(head>=last)q[++last]=id;
else
{
while(head<last&&check(q[last-1],q[last],id))last--;
q[++last]=id;
}
}
int query(ld x)
{
if(head==last)return q[head];
int l=head-1,r=last;
while(l<r-1)
{
int m=(l+r)>>1;
if(cal(q[m],x)<cal(q[m+1],x))l=m;
else r=m;
}
return q[l+1];
}
}h;
void solve(int l,int r)
{
if(l==r)return ;
int m=(l+r)>>1;
solve(l,m);
h.init();
int cnt=0;
for(int i=l;i<=m;i++)d[cnt++]=info{dp[i]*c[i]/(a[i]*c[i]+b[i]),dp[i]/(a[i]*c[i]+b[i]),i};
sort(d,d+cnt);
for(int i=0;i<cnt;i++)h.update(d[i].id);
dp[m+1]=max(dp[m+1],dp[m]);
for(int i=m+1;i<=r;i++)
{
if(h.head<=h.last)
{
int x=h.query(-a[i]/b[i]);
dp[i]=max(dp[i],dp[x]*(a[i]*c[x]+b[i])/(a[x]*c[x]+b[x]));
}
}
solve(m+1,r);
}
int main()
{
int n,s;scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++)
{
db x,y,z;scanf("%lf%lf%lf",&x,&y,&z);
a[i]=x,b[i]=y,c[i]=z;
}
dp[1]=s;
solve(1,n);
printf("%.3f\n",(db)dp[n]);
return 0;
}
/******************** ********************/

set维护:

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define ld long double
//#define C 0.5772156649
//#define ls l,m,rt<<1
//#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define ull unsigned long long
//#define base 1000000000000000000
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;} using namespace std; const ull ba=233;
const db eps=1e-8;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f3f; struct node{
ld x,y;
mutable ld k;
node(){}
node(ld _x,ld _y,ld _k){x=_x,y=_y,k=_k;}
bool operator <(const node&rhs)const{
if(rhs.y==-1e15)return k>rhs.k;
return x<rhs.x||(x==rhs.x&&y<rhs.y);
}
};
struct hull:set<node>{
bool bad(iterator it)
{
if(it==begin()||next(it)==end())return 0;
return (ld)(it->y-prev(it)->y)*(next(it)->x-it->x)<=(ld)(next(it)->y-it->y)*(it->x-prev(it)->x);
}
void cal(iterator it)
{
if(next(it)==end())it->k=-1e15;
else it->k=(ld)(next(it)->y-it->y)/(next(it)->x-it->x);
}
void update(node x)
{
if(find(x)!=end())return ;
iterator it=insert(x).fi;
if(bad(it)){erase(it);return ;}
while(it!=begin()&&bad(prev(it)))erase(prev(it));
while(next(it)!=end()&&bad(next(it)))erase(next(it));
cal(it);
if(it!=begin())cal(prev(it));
}
ld query(ld k)
{
if(size()==0)return 0;
auto it=lower_bound(node(0,-1e15,-k));
// printf("%d %f %f ---\n",size(),(db)it->x,(db)it->y);
return it->y+it->x*k;
}
}h;
ld dp[N],a[N],b[N],c[N];
int main()
{
int n,s;scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++)
{
db x,y,z;scanf("%lf%lf%lf",&x,&y,&z);
a[i]=x,b[i]=y,c[i]=z;
}
dp[1]=s;
for(int i=2;i<=n;i++)
{
dp[i]=dp[i-1];
h.update(node(dp[i-1]*c[i-1]/(a[i-1]*c[i-1]+b[i-1]),dp[i-1]/(a[i-1]*c[i-1]+b[i-1]),0));
dp[i]=max(dp[i],h.query(a[i]/b[i])*b[i]);
// printf("%f\n",(db)(h.query(a[i]/b[i])*b[i]));
}
// printf("%f %f\n",(db)(*next(h.begin())).x,(db)(*next(h.begin())).y);
printf("%.3f\n",(db)dp[n]);
return 0;
}
/******************** ********************/

loj#2353. 「NOI2007」 货币兑换 斜率优化的更多相关文章

  1. loj2353. 「NOI2007」 货币兑换

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

  2. 「NOI2007」 货币兑换

    「NOI2007」 货币兑换 题目描述 小 Y 最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A 纪念券(以下简称 A 券)和 B 纪念券(以下简称 B 券).每个持有金券的顾客都有一个自 ...

  3. loj#2483. 「CEOI2017」Building Bridges 斜率优化 cdq分治

    loj#2483. 「CEOI2017」Building Bridges 链接 https://loj.ac/problem/2483 思路 \[f[i]=f[j]+(h[i]-h[j])^2+(su ...

  4. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

  5. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  6. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  7. loj#2129. 「NOI2015」程序自动分析

    题目链接 loj#2129. 「NOI2015」程序自动分析 题解 额... 考你会不会离散化优化常数 代码 #include<queue> #include<cstdio> ...

  8. Loj #2554. 「CTSC2018」青蕈领主

    Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...

  9. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

随机推荐

  1. hexo在github和coding.net部署并分流(一)

    安装GIT和Node.JS 首先在自己的电脑上安装好git和node.js,这一步怎么做自己搜索,安装软件都是下一步下一步,应该不难,GIT安装完成后打开git cmd输入 git config -- ...

  2. 【系列教程1】Gradle入门系列三:依赖管理

    在现实生活中,要创造一个没有任何外部依赖的应用程序并非不可能,但也是极具挑战的.这也是为什么依赖管理对于每个软件项目都是至关重要的一部分. 这篇教程主要讲述如何使用Gradle管理我们项目的依赖,我们 ...

  3. WSL及Linux入门

    win10内置linux子系统(Windows Subsystem for Linux),可以不用安装Vmware等虚拟机学习linux啦. wsl开启方式 设置打开开发人员模式. 控制面板-程序和功 ...

  4. 常用for循环和for in 以及for of 的区别

    用Es6对象扩展运算符(…)与rest运算符说明 function test(first,...a){ for(let val=0; val<a.length;val++){ console.l ...

  5. ZJOI 2015 幻想乡战略游戏(动态点分治)

    题意 https://loj.ac/problem/2135 思路 首先要明确一点,答案分布是有单调性的.什么意思呢?假设我们的答案在 \(u\) 节点,\((u,v)\) 之间有一条边且 \(u\) ...

  6. CentOS7使用httpd apache 和firewalld打开关闭防火墙与端口

    Centos7 使用systemctl 工具操作命令 systemctl 是Centos7的服务管理工具中的主要工具 ,它融合之前service和chkconfig的功能于一体 一.httpd的设置 ...

  7. 每天一个小程序—0014题(txt 转 Excel)

    基础知识:Excel文件的后缀有xls和xlsx,前者是针对2003版本的,2007及其之后的版本是xlsx. 在python中对于这两种不同后缀的文件有不同的库来处理,对于xls用wlrd.xlwt ...

  8. python Exception中的raise、assert

    使用raise抛出异常 当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常.一旦执行了raise语句,raise后面的语句将不能执行. 演示raise用法. try: s ...

  9. 百度地图自定义icon,定位偏移问题

    最近使用百度地图做一个调度系统,使用定义icon的marker,结果地图显示marker和实际位置偏移,最终参考文章: http://www.cnblogs.com/jz1108/archive/20 ...

  10. python函数名称

    一.第一类对象, 函数名的使用 函数名就是变量名, 函数名存储的是函数的内存地址 变量的命名规范: 由数字, 字母, 下划线组成 不能是数字开头, 更不能是纯数字 不能用关键字 不要太长 要有意义 不 ...