正题

题目链接:https://jzoj.net/senior/#contest/show/3011/2


题目大意

n+1n+1n+1个连续的地方,每个地方有(a,b,c)(a,b,c)(a,b,c)。

从000开始,每次往前选择一个不超过LLL的位置,跳到那里并选择中间不包括起点的位置中ccc最大的地方获取这个位置的a,ba,ba,b。

最后要求aaa的值和bbb的值比值最大。


解题思路

显然的0/1分数规划问题,二分答案midmidmid,把价值变为a−b∗mida-b*mida−b∗mid,然后求价值最大。

考虑dpdpdp,先预处理出每个位置的cic_ici​能影响到的位置(前面的最近一个比它大的ccc)。

然后dpdpdp,fif_ifi​表示走到iii时最大价值。

枚举一个iii,我们现在要计算fif_ifi​,然后定义wjw_jwj​表示从jjj跳到iii时需要战斗的地方的价值。

然后用一颗线段树维护fff的区间最大值和f+wf+wf+w的区间最大值,之后我们每次单点修改fff,区间修改www即可。

时间复杂度O(100nlog⁡n)O(100n\log n)O(100nlogn)(这里进行了100100100次二分)。


codecodecode

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
const int N=3e4+10;
const double eps=1e-7;
int n,l,c[N],h[N],last[N];
double a[N],b[N],f[N],w[N];
struct Tree_Array{int t[N];void Change(int x,int val){while(x<=n){t[x]=val;x+=lowbit(x);}}int Ask(int x){int ans=0;while(x){ans=max(ans,t[x]);x-=lowbit(x);}return ans;}
}Ta;
struct Seq_Tree{double f[N*4],w[N*4],lazy[N*4];void ReBuild(){for(int i=0;i<4*N;i++)f[i]=w[i]=-1e9,lazy[i]=0;return;}void Merge(int x){f[x]=max(f[x*2],f[x*2+1]);w[x]=max(w[x*2],w[x*2+1]);return;}void Downdata(int x){if(lazy[x]==0) return;w[x*2]=f[x*2]+lazy[x];w[x*2+1]=f[x*2+1]+lazy[x];lazy[x*2]=lazy[x*2+1]=lazy[x];lazy[x]=0;return;}void ChangeF(int x,int pos,int L,int R,double val){if(L==R){f[x]=val;return;}Downdata(x);int mid=(L+R)>>1;if(pos<=mid) ChangeF(x*2,pos,L,mid,val);else ChangeF(x*2+1,pos,mid+1,R,val);Merge(x);return;}void ChangeZ(int x,int l,int r,int L,int R,double val){if(L==l&&R==r){lazy[x]=val;w[x]=f[x]+val;return;}Downdata(x);int mid=(L+R)/2;if(r<=mid) ChangeZ(x*2,l,r,L,mid,val);else if(l>mid) ChangeZ(x*2+1,l,r,mid+1,R,val);else ChangeZ(x*2,l,mid,L,mid,val),ChangeZ(x*2+1,mid+1,r,mid+1,R,val);Merge(x);return;}double Ask(int x,int l,int r,int L,int R){if(L==l&&R==r)return w[x];Downdata(x);int mid=(L+R)/2;if(r<=mid) return Ask(x*2,l,r,L,mid);if(l>mid) return Ask(x*2+1,l,r,mid+1,R);return max(Ask(x*2,l,mid,L,mid),Ask(x*2+1,mid+1,r,mid+1,R));}
}T;
bool check(double x){for(int i=1;i<=n;i++)w[i]=a[i]-b[i]*x;T.ReBuild();T.ChangeF(1,0,0,n,0);for(int i=1;i<=n;i++){T.ChangeZ(1,last[i],i-1,0,n,w[i]);f[i]=T.Ask(1,max(0,i-l),i-1,0,n);T.ChangeF(1,i,0,n,f[i]);}return f[n]>=0;
}
int main()
{scanf("%d%d",&n,&l);for(int i=1;i<=n;i++){scanf("%lf%lf%d",&a[i],&b[i],&h[i]);c[i]=h[i];}sort(c+1,c+1+n);int m=unique(c+1,c+1+n)-c-1;for(int i=1;i<=n;i++){h[i]=m-(lower_bound(c+1,c+1+m,h[i])-c)+1;last[i]=Ta.Ask(h[i]-1);Ta.Change(h[i],i);}double l=0,r=1000000;for(int i=1;i<=100;i++){double mid=(l+r)/2.0;if(check(mid)) l=mid;else r=mid;}double ans=(l+r)/2;int loc=0;while(ans>10) ans/=10,loc++;while(ans<1) ans*=10,loc--;printf("%.9lfe",ans);if(loc>=0) printf("+%03d",loc);else printf("%04d",loc);return 0;
}

jzoj4017-逃跑【0/1分数规划,线段树,dp】相关推荐

  1. P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为nnn的串TTT,用0∼90\sim 90∼9填充所有的.... 然后给出mmm个串和 ...

  2. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  3. jzoj3852-单词接龙【0/1分数规划,负环】

    正题 题目链接:https://jzoj.net/senior/#main/show/3852 题目大意 nnn个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...

  4. [学习笔记]0/1分数规划

    对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...

  5. #0/1分数规划,SPFA,负环#洛谷 1768 天路

    题目链接 分析 可以发现,这是一道0/1分数规划的题目,需要二分答案,然后判定是否存在负环,所以说bfs貌似不高效,那就用dfs吧,若二分答案为0,即不合法 代码 #include <cstdi ...

  6. 转载二分 01 分数规划即最大化平均值的证明0/1分数规划、最优比率生成树、最优比率环

    首页 新随笔 联系 管理 订阅 随笔- 20  文章- 0  评论- 9 [Algorithm]01分数规划--Update:2012年7月27日 [关键字] 0/1分数规划.最优比率生成树.最优比率 ...

  7. 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

    题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...

  8. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  9. C2 - Pokémon Army (hard version)(思维+差分/线段树+dp)详解

    https://codeforces.com/contest/1420/problem/C2 这道题十分的锻炼思维,也让我知道了同样是差分,从前面减后面和从后面减前面是有不同的意义的. 还记得c1吗? ...

最新文章

  1. Error: Aesthetics must be either length 1 or the same as the data (5): fill
  2. salt上编写了备份日志的脚本
  3. 网口扫盲二:Mac与Phy组成原理的简单分析(转)
  4. android的ListView做表格添加圆角边框
  5. 转行学编程,女孩子适合web前端还是Java?
  6. mysql 单向复制_Mysql 复制(Replication)实现
  7. php.h not found,编译错误“fatal error: 'xxxx.h' file not found” 如何解决
  8. 签到太麻烦?全自动一键签到网易云音乐,b站,京东,百度贴吧等网站
  9. [面试必考]OSI 网络七层协议以及各层的功能
  10. 成都蚂蚁金服java_成都蚂蚁金服暑期实习Java后台开发面经(已收到OC)
  11. 前端 day02 CSS
  12. 友盟社会化分享之判断是否安装了QQ、微信、新浪微博客户端
  13. 吴恩达机器学习(十五)—— 应用实例:图片文字识别
  14. Tortoisegit 远端版本回退
  15. linux 底下traceroute报错(下载安装流程教学)
  16. 2022年R1快开门式压力容器操作考试资料及R1快开门式压力容器操作考试总结
  17. 英语字母c的语言教案,幼儿园小班英语单词教案五篇
  18. 人力资源机器下载方法
  19. 好用的mac录屏软件推荐:白菜录屏mac中文免费版
  20. IDEA中使用百度编辑器

热门文章

  1. 小学学校计算机教室使用计划,小学电脑室工作计划
  2. linux expr格式,计算2-expr命令举例
  3. bios是固定在微型计算机上的一块RoM,计算机硬件笔试试题
  4. 计算机u打字,win7电脑打字打不出来怎么办
  5. php导出数据库的指定表数据,MYSQL教程mysql数据库导出指定表数据的方法
  6. baidumap vue 判断范围_懂一点前端—Vue快速入门
  7. Java当中编码和解码(以及出现乱编码的原因)
  8. C++中判断在字符串中是否存在空格 以及 如何输入带空格的字符串
  9. [mybatis]动态sql_内置参数_parameter_databaseid
  10. [SpringBoot2]ajax函数中data参数的数据设置方式