bzoj1492(cdq分治+凸包+优化dp)
来源:互联网 发布:百慕达网络超市 编辑:程序博客网 时间:2024/06/05 00:11
我们会发现dp不满足单调性,但是可以构建凸包,其中点的表示方法很巧妙
要对一些问题转化成凸包敏感一点,尝试找出表示凸包的点,看看是否可以用斜率来表示答案。
一定要写eps,wa到死。。。
在cdp分治如果预先,处理了某一维信息相对的顺序,那么在分治中千万不能打破这个顺序!!!!
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<cstdlib>#include<queue>using namespace std;const int N=120005;int n,st[N];double f[N],a[N],b[N],rate[N];const double eps=1e-9;struct vec{double x,y;};typedef vec point;point p[N],pp[N];struct aa{ double k; int id;}t[N],t1[N];bool cmp(aa a,aa b) {return a.k<b.k;}bool operator <(point a,point b) {return a.x<b.x||(fabs(a.x-b.x)<eps&&a.y<b.y);}double get(int a,int b){if (fabs(p[a].x-p[b].x)<eps) return -1e9;return (p[a].y-p[b].y)/(p[a].x-p[b].x);}void work(int l,int r) { if (l==r) { f[l]=max(f[l],f[l-1]); p[l].y=f[l]/(rate[l]*a[l]+b[l]); p[l].x=p[l].y*rate[l]; return ; } int mid=(l+r)>>1,ll=l,rr=mid+1; for (int i=l;i<=r;i++) if (t[i].id<=mid) t1[ll++]=t[i];else t1[rr++]=t[i];//已经排好序了,绝对不能改变相对顺序!!! for (int i=l;i<=r;i++) t[i]=t1[i]; work(l,mid); int sz=0; for (int i=l;i<=mid;i++) { while (sz>1&&get(i,st[sz])+eps>get(st[sz],st[sz-1])) sz--; st[++sz]=i; } int now=1; for (int i=r;i>mid;i--) { while (now<sz&&get(st[now+1],st[now])>t[i].k) now++; int pos=t[i].id; f[pos]=max(f[pos],p[st[now]].y*b[pos]+p[st[now]].x*a[pos]); } work(mid+1,r); int h = l, t = mid + 1; for(int i = l; i <= r; ++i) if ((p[h] < p[t] || t > r) && h <= mid) pp[i] = p[h++]; else pp[i] = p[t++]; for(int i = l; i <= r; ++i) p[i] = pp[i];} int main(){ scanf("%d%lf",&n,&f[0]); for (int i=1;i<=n;i++) scanf("%lf%lf%lf",&a[i],&b[i],&rate[i]),t[i].k=-a[i]/b[i],t[i].id=i; sort(t+1,t+n+1,cmp); work(1,n); printf("%.3lf",f[n]); return 0;}
0 0
- bzoj1492(cdq分治+凸包+优化dp)
- CDQ分治维护凸包 优化dp 【NOI2007】货币兑换cash bzoj1492
- BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)
- bzoj1492 [ NOI2007 ] --斜率优化DP+cdq分治
- [BZOJ1492][NOI2007][CDQ分治][斜率优化][DP]货币兑换Cash
- [BZOJ1492][NOI2007]货币兑换Cash-斜率优化DP-CDQ分治
- BZOJ1492:[NOI2007]货币兑换Cash (CDQ分治+斜率优化DP/平衡树维护凸壳)
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化dp+cdq分治)
- [BZOJ1492][NOI2007][斜率优化][动态凸包][DP][分治]货币兑换cash
- BZOJ1492【CDQ分治】
- CDQ分治优化DP
- bzoj1492 [NOI2007]货币兑换Cash (斜率DP+cdq分治)
- BZOJ1492: [NOI2007]货币兑换Cash 【dp + CDQ分治】
- [BZOJ1492][NOI2007]货币兑换Cash && CDQ分治+斜率优化
- 【bzoj1492】【NOI2007】【货币兑换】【斜率优化+cdq分治】
- bzoj1492 [NOI2007]货币兑换Cash(斜率优化+CDQ分治)
- [bzoj1492][cdq分治][斜率优化][NOI2007]货币兑换Cash
- bzoj1492 货币兑换 CDQ分治
- 136-基于 UDP 协议的通信
- 安装gensim
- Python学习笔记(6)——列表、元组、字典
- 浅析Android四大组件之一:ContentProvider 内容提供者 源码
- Android studio 插件 ADB WIFI
- bzoj1492(cdq分治+凸包+优化dp)
- 欢迎使用CSDN-markdown编辑器
- (转)Android:控件WebView显示网页
- P3366 【模板】最小生成树
- java集合操作
- 剑指offer:二叉搜索树的后序遍历序列
- poj 2912 Rochambeau(带权并查集)(枚举)
- OpenCV-视频流动态特征感兴趣区域检测--模板匹配(MatchingMethod)
- 判断凶手是哪个