【BZOJ1492】【NOI2007】货币兑换
我果然不会斜率优化
原题:
.png)
.png)

f[i]这么鬼畜的意义我是想不到啊QAQ
恩这道题从一开始就鬼畜了起来
根据得出的基础dp可以写出n^2的程序,显然优化对吧,斜率优化(为啥要斜率优化?我不懂啊QAQ
然后令j比k优,就酱
令g[i]=f[i]/rate[i],酱
然后就斜率优化了,但是维护凸包似乎很麻烦(我不会QAQ),splay不好写,我们cdq分治
具体咋整,看代码意会吧我讲不清楚QAQ
方便以后常看所以代码加了注释QAQ
代码:(抄黄学长的QAQ
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const double inf=1e20;
const double eps=2e-;
struct nds{double x,y,a,b,k,rt; int w,id;}a[],tmp[];
int n;
double f[];
int stck[],tp=;
double gtk(int x,int y){
if(!y) return -inf;
if(fabs(a[x].x-a[y].x)<eps) return inf;
return (a[y].y-a[x].y)/(a[y].x-a[x].x);
}
void cdq(int l,int r){
if(l==r){
f[l]=max(f[l],f[l-]);
a[l].y=f[l]/(a[l].a*a[l].rt+a[l].b);//y是a券的个数
a[l].x=a[l].rt*a[l].y;//x是b券
return ;
}
int md=(l+r)>>; int t1=l,t2=md+;
for(int i=l;i<=r;++i) tmp[(a[i].id<=md?t1:t2)++]=a[i];
for(int i=l;i<=r;++i) a[i]=tmp[i];//先按照原来id左右划分
cdq(l,md);//中序cdq
tp=;
for(int i=l;i<=md;++i){
while(tp> && gtk(stck[tp-],stck[tp])<gtk(stck[tp-],i)+eps) --tp; stck[++tp]=i;
}//搞左边的凸包
stck[++tp]=;
for(int i=md+,j=;i<=r;++i){
while(j<tp && gtk(stck[j],stck[j+])+eps>a[i].k) ++j;
f[a[i].id]=max(f[a[i].id],a[stck[j]].x*a[i].a+a[stck[j]].y*a[i].b);
}//更新答案
cdq(md+,r);
t1=l,t2=md+;
for(int i=l;i<=r;++i){
if(t1>md) tmp[i]=a[t2++];
else if(t2>r) tmp[i]=a[t1++];
else tmp[i]=a[(a[t1].x<a[t2].x||(fabs(a[t1].x-a[t2].x)<eps&&a[t1].y<a[t2].y)?t1:t2)++];
}//按x第一y第二优先级排序,方便上一层搞凸包a
for(int i=l;i<=r;++i) a[i]=tmp[i];
}
bool cmp(nds a,nds b){ return a.k>b.k;}
int main(){freopen("ddd.in","r",stdin);
scanf("%d%lf",&n,&f[]);
for(int i=;i<=n;++i){
scanf("%lf%lf%lf",&a[i].a,&a[i].b,&a[i].rt);
a[i].k=-a[i].a/a[i].b,a[i].id=i;
}
sort(a+,a+n+,cmp);//没想明白对k排序的意义QAQ
cdq(,n);
printf("%.3lf\n",f[n]);
return ;
}
【BZOJ1492】【NOI2007】货币兑换的更多相关文章
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5838 Solved: 2345[Submit][Sta ...
- bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5541 Solved: 2228[Submit][Sta ...
- bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...
- BZOJ1492: [NOI2007]货币兑换Cash 【dp + CDQ分治】
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MB Submit: 5391 Solved: 2181 [Submit][S ...
- [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5907 Solved: 2377[Submit][Sta ...
- BZOJ1492: [NOI2007]货币兑换Cash
设$x_j$,$y_j$为第$j$天能买的A,B券数量,$f_i$为第$i$天的最大收益.$f_i=\max_{1\le j<i}a_ix_j+b_iy_j$,最大化$f_i$即找一个点$(x_ ...
- BZOJ1492 [NOI2007]货币兑换
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- Bzoj1492: [NOI2007]货币兑换Cash(不单调的斜率优化)
题面 传送门 Sol 题目都说了 必然存在一种最优的买卖方案满足: 每次买进操作使用完所有的人民币: 每次卖出操作卖出所有的金券. 设\(f[i]\)表示第\(i\)天可以有的最大钱数 枚举\(j&l ...
- bzoj1492 [NOI2007]货币兑换Cash【cdq分治】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1492 推荐博客:http://www.cnblogs.com/zig-zag/archive ...
随机推荐
- ie浏览器get url返回404问题
昨晚同事说之前给的接口不能get方式的,直接在ie浏览器访问返回404,说明是参数有问题. 同样的接口使用curl和postman请求都正常,其他ie之外的浏览器也都正常响应. 记录下排查过程: 问题 ...
- python之路-网络基础
1.什么是网络: 通过网络设备将各个设备连接在一起,使用协议让设备之间可以通信,共享资源,这些组成了一个网络. 2.osi七层模式: 国际标准化组织(ISO)创建OSI(开放系统互联)参考模型,希望不 ...
- svn服务器搭建及使用(二)
上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用. 首先打开Vi ...
- 1014 2018 使用FLAG counter
AmazingCounters.com 不能用了,服务器访问不了了,之前的博客浏览量也看不到了,1014号换了个新的--FLAG counter,就是博客右边那个.
- GDI中StretchBlt或Blt缩放图片失真问题
在用Scrollview控件的缩放图片时,严重失真: 解决方法:dc.SetStretchBltMode(COLORONCOLOR). 参考文章:https://blog.csdn.net/m3728 ...
- do while
do while结构的基本原理和while结构是基本相同的,但是它保证循环体至少被执行一次.因为它是先执行代码,后判断条件,如果条件为真,继续循环.
- Android开发 --代码布局
Android开发 --代码布局 在线性布局LinearLayout里加入view比较简单,因为属性比较少,布局简单 示例,加入一个TextView LinearLayout layout = (Li ...
- SharePoint online Multilingual support - Development(1)
博客地址:http://blog.csdn.net/FoxDave 上一节讲了SharePoint Online网站多语言的实现原理机制,本节主要从编程的角度来谈一下如何进行相关的设置. 下面列出 ...
- oracle用户下查看服务器或者本地IP地址
1.查看oracle所在服务器的ip: select utl_inaddr.get_host_address from dual; 2.查看登陆oracle机器的IP: select sys_cont ...
- 多点触控 TouchAction
#TouchAction #TouchAction方法是appium自已定义的新方法 # * 短按 (press) * 释放 (release) * 移动到 (moveTo) * 点击 (tap) * ...