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

正题

题目链接: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*midabmid,然后求价值最大。

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

然后dpdpdpfif_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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13、play中实现信息国际化

目录 1、指定应用使用的语言 2、语言配置文件 3、在Controller中使用 4、在模板中使用 5、改变当前请求的语言 6、格式化信息 1、指定应用使用的语言 在conf/application.conf中进行配置&#xff1a; 这些语言标记将用于创建play.i18n.Lang实例。要访问应用程序支持的语…

重温基数排序

前几天沈阳现场赛遇到了一道题&#xff0c;其中的一部分不能用快排&#xff0c;只能用基数排序&#xff0c;当时不会写基数排序&#xff0c;gg&#xff0c;从银滑到了铜。。。。真是血的教训&#xff0c;现在再来回顾一下。 输入n个整数&#xff0c;最大的整数不超过6位&#…

2018年10月17日普级B组【模拟赛】

2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛 第一题——ISBN号码第一题——ISBN号码第一题——ISBN号码 博客链接&#xff1a; https://blog.csdn.net/ssllyf/article/details/83212746 第二题——笨小猴第二题——笨小猴第二题——笨…

讨论过后而引发对EF 6.x和EF Core查询缓存的思考

前言最近将RabbitMQ正式封装引入到.NET Core 2.0项目当中&#xff0c;之前从未接触过这个高大上的东东跟着老大学习中&#xff0c;其中收获不少&#xff0c;本打算再看看RabbitMQ有时间写写&#xff0c;回来后和何镇汐大哥探讨了一点关于EF和EF Core的内容&#xff0c;于是乎本…

CF297E-Mystic Carvings【树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/CF297E 题目大意 2∗n2*n2∗n个点的圆&#xff0c;nnn条圆上不交的弦&#xff0c;选择三条使得每条弦对应的弧上的点数量相等。 解题思路 就这5种情况&#xff0c;其中满足条件的是222和555&#xff0c;我们用容斥去掉1,3,41,…

14、使用play搭建一个web应用用例

目录 1、play下载 2、启动play项目 3、将项目导入到eclipse 4、play项目中前端开发 5、添加bootstrap ace页面模板 1、play下载 找到官网&#xff0c;直接下载即可 2、启动play项目 解压文件&#xff0c;进入到项目顶级目录 等一会&#xff0c;下载jar包&#xff0c;第一…

截取【二分】

截取 题目描述 给你N段线的长度&#xff0c;现在要你从他们上面切下K段来&#xff08;切下的不能合并&#xff09;&#xff0c;使得这K段长度相等&#xff0c;并且最大。如若求出的答案小于0.01&#xff0c;则认为无解&#xff0c;输出0.00。&#xff08;所有非整数都精确到了…

EF Core 2.0使用MsSql/Mysql实现DB First和Code First

环境Visual Studio 2017 最新版本的.NET Core 2.0 SDK最新版本的 Windows PowerShell开始搭建1、在 Visual Studio 2017 中创建新项目“文件”>“新建”>“项目”从左侧菜单中选择“已安装”>“模板”>“Visual C#”>“.NET Core”。选择“ASP.NET Core Web 应用…

jzoj4019-Path【dp】

正题 题目链接:https://jzoj.net/senior/#contest/show/3014/1 题目大意 n∗mn*mn∗m的格子&#xff0c;开始在(n,1)(n,1)(n,1)&#xff0c;每次可以右拐或者往前&#xff0c;不能走重复的和障碍&#xff0c;求有多少种方案到达(y,x)(y,x)(y,x) 解题思路 设fs,x1,y1,x2,y2f_{…

基于SSM+JBPM的智能化OA办公平台

目录 1、项目介绍 2、业务架构和技术架构 3、数据模型 4、界面展示 写在前面&#xff1a;如果有小伙伴儿想获取智能化OA办公平台管理系统的对应源码和数据表结构&#xff0c;可以关注博主然后给博主发私信哟。 1、项目介绍 本项目是一款智能化OA办公平台&#xff0c;其目的…

森近林之助【字符串处理】

森近林之助森近林之助森近林之助 题目大意 输入n个字符串&#xff0c;每一位总共要出现两个“1”&#xff0c;一个“0”&#xff0c;求最少要加多少个字符串才能满足条件 解题思路&#xff1a; 这题就是将每一位出现“1”和“0”的次数加在一起&#xff0c;看每一位缺多少个…

EFCore2.0@Xamarin.Forms

由于忙于Xamarin的书的创作很久没有和大家见面了&#xff0c;回到博客我会陆续更新一些最新的Xamarin技术&#xff0c;还有最近一直在努力的人工智能相关知识。话说csdn的博客改版了。总觉得变化是好事情啊。 这篇博客&#xff0c;我想和大家说说EFCore&#xff0c;在.NET…

jzoj4020-Revolution【网络流,最小割】

正题 题目链接:https://jzoj.net/senior/#contest/show/3014/2 题目大意 n∗mn*mn∗m的地方&#xff0c;每个地方有购买价格和收益&#xff0c;一个地方如果四周都被购买那么也可以获得这个地方的收益。 求收益-价格最大。 解题思路 考虑网络流&#xff0c;进行奇偶染色&…

1、mybatis是什么?为什么要用mybatis?

对于初学者&#xff0c;如果进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

codeforces 877F F. Ann and Books hash+莫队算法

题意&#xff1a;给你一堆数字&#xff0c;每个数字有正负之分&#xff0c;求任意区间内和为k的子区间的个数。 题解&#xff1a; 先把前缀和都求出来&#xff0c;构成一个数组sum。 建立一个hash表&#xff0c;然后考虑区间sum[l,r]&#xff0c;从左到右扫&#xff0c;每扫…

花生采摘

花生采摘花生采摘花生采摘 题目描述 鲁宾逊先生有一只宠物猴&#xff0c;名叫多多。这天&#xff0c;他们两个正沿着乡间小路散步&#xff0c;突然发现路边的告示牌上贴着一张小小的纸条&#xff1a;“欢迎免费品尝我种的花生&#xff01;——熊字”。 鲁宾逊先生和多多都很…

P3317-[SDOI2014]重建【矩阵树定理,数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/P3317 题目大意 nnn个点若干条边。告诉你每条边出现的概率&#xff0c;求刚好出现一颗生成树的概率是多少。 解题思路 矩阵树定理是计算每个生成树的每条边乘积之和。 我们考虑将答案转换为那个形式&#xff0c;ai,ja_{i,j}…

2、mybatis的基本使用

对于初学者&#xff0c;如果进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

【动态规划】石子合并 (ssl 2863)

石子合并石子合并石子合并 Description 在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。请设计一个程序&#xff0c;计算出将N堆石子合并成一堆的最小得分。…

codeforces 884F 费用流,图解很清晰

代码&#xff1a; #include<bits/stdc.h> using namespace std; const int inf 1e9; const int mm 111111; const int maxn 2999; int node,src,dest,edge; int ver[mm],flow[mm],cst[mm],nxt[mm]; int head[maxn],work[maxn],dis[maxn],q[maxn]; int tot_cost; void …