P4027 [NOI2007] 货币兑换
前言
打完这道题,感觉对李超线段树又有了进一步的了解。
分析
一个明显的性质,如果要买卷或卖卷的话,那么一定是全买全卖的,显然。
设
则有
若第
若第
变形得,
设
注意到
#include<bits/stdc++.h> #define N 100005 #define db double #define ls u<<1 #define rs u<<1|1 #define eps 1e-6 using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } int n; int tree[N<<2]; db ans; db A[N],B[N],R[N],C[N],D[N],x[N],y[N]; db calc(int pos,int id){return D[pos]*x[id]+y[id];} db Query(int u,int l,int r,int X){ if(l==r) return calc(X,tree[u]); int mid=(l+r)>>1; db res=calc(X,tree[u]); if(X<=mid) res=max(res,Query(ls,l,mid,X)); else res=max(res,Query(rs,mid+1,r,X)); return res; } void UpDate(int u,int l,int r,int id){ if(calc(l,id)>calc(l,tree[u])&&calc(r,id)>calc(r,tree[u])) return void(tree[u]=id); else if(calc(l,id)<=calc(l,tree[u])&&calc(r,id)<=calc(r,tree[u])) return ; int mid=(l+r)>>1; if(x[id]+eps>x[tree[u]]){ if(calc(mid,id)+eps>calc(mid,tree[u])) UpDate(ls,l,mid,tree[u]),tree[u]=id; else UpDate(rs,mid+1,r,id); }else{ if(calc(mid,id)>calc(mid,tree[u])+eps) UpDate(rs,mid+1,r,tree[u]),tree[u]=id; else UpDate(ls,l,mid,id); } } signed main(){ n=read(),scanf("%lf",&ans); for(int i=1;i<=n;++i){ scanf("%lf%lf%lf",&A[i],&B[i],&R[i]); C[i]=D[i]=A[i]/B[i]; } sort(D+1,D+1+n); for(int i=1;i<=n;++i){ int X=lower_bound(D+1,D+1+n,C[i])-D; ans=max(ans,B[i]*Query(1,1,n,X)); x[i]=R[i]*ans/(R[i]*A[i]+B[i]),y[i]=ans/(R[i]*A[i]+B[i]); UpDate(1,1,n,i); } printf("%.3lf\n",ans); return 0; }
本文作者:南风未起
本文链接:https://www.cnblogs.com/jiangchen4122/p/16899121.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步