P2048-[NOI2010]超级钢琴【RMQ,堆】

正题

题目链接:https://www.luogu.org/problemnew/show/P2048


题目大意

一个长度为nnn序列aaa。寻找kkk个子序列要求长度在L∼RL\sim RLR之间,求这kkk个子序列的最大和。


解题思路

首先对aaa求出前缀和数组sss。题目转换为求kkk个数对要求两两之间距离在L∼RL\sim RLR且差最大。

因为数对之间互不影响,所以显然求前kkk大的数对就好了。

我们在大根堆之中存储一个五元组(l,r,id,x,val)(l,r,id,x,val)(l,r,id,x,val)。表示对于后面的数idididl∼rl\sim rlr之间求一个xxx使得val=aid−axval=a_{id}-a_xval=aidax最大。堆以valvalval为关键字。xxxvalvalval我们可以用RMQRMQRMQ快速计算出来。

然后我们开始时对于每个iii我们将(i−R,i−L,i,x,val)(i-R,i-L,i,x,val)(iR,iL,i,x,val)丢入堆中。

之后执行kkk次取出对顶(l,r,id,x,val)(l,r,id,x,val)(l,r,id,x,val)使ans+=valans+=valans+=val
然后将(l,x−1,id,x′,val′)(l,x-1,id,x',val')(l,x1,id,x,val)(x+1,r,id,x′,val′)(x+1,r,id,x',val')(x+1,r,id,x,val)重新丢入堆中,这样就保证了对于不同的idididxxx不会重复而且也能取到最大。

时间复杂度:O(nlog(n+k)):O(n\ log\ (n+k)):O(n log (n+k))


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=501000;
ll n,k,L,R,lg[N],f[30][N],a[N],ans,w[30][N];
ll RMQ(ll l,ll r)
{ll z=lg[r-l+1];return f[z][l]<f[z][r+1-(1<<z)]?w[z][l]:w[z][r+1-(1<<z)];
}
struct node{ll l,r,x,id,val;node(ll _l=0,ll _r=0,ll _id=0){l=_l;r=_r;id=_id;x=RMQ(l,r);val=a[id]-a[x];}
};
bool operator <(const node &a,const node &b)
{return a.val<b.val;}
priority_queue<node> q;
int main()
{scanf("%lld%lld%lld%lld",&n,&k,&L,&R);lg[0]=-1;for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);a[i]+=a[i-1];f[0][i]=a[i];w[0][i]=i;lg[i]=lg[i/2]+1;}for(ll i=1;(1<<i)<=n;i++)for(ll j=0;j+(1<<i)-1<=n;j++){if(f[i-1][j+(1<<i-1)]<f[i-1][j])w[i][j]=w[i-1][j+(1<<i-1)];elsew[i][j]=w[i-1][j];f[i][j]=min(f[i-1][j],f[i-1][j+(1<<i-1)]);}for(ll i=L;i<=n;i++)q.push(node(max(i-R,0ll),i-L,i));while(k--){node z=q.top();ans+=z.val;q.pop();if(z.x>z.l) q.push(node(z.l,z.x-1,z.id));if(z.x<z.r) q.push(node(z.x+1,z.r,z.id));}printf("%lld",ans);
}

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

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

相关文章

Sentinel(二)之Quick Start

转载自 Sentinel Quick Start 1.1 公网 Demo 如果希望最快的了解 Sentinel 在做什么&#xff0c;我们可以通过 Sentinel 新手指南 来运行一个例子&#xff0c;并且能在云上控制台上看到最直观的监控和流控效果等。 1.2 手动接入 Sentinel 以及控制台 下面的例子将展示应用如…

hdu5115-Dire Wolf【区间dp】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid5115 题目大意 有nnn只狼&#xff0c;击败第iii只狼会扣aia_iai​加上于其相邻的狼的blbrb_lb_rbl​br​点hphphp。注意该狼被击败后会使原来于其相邻的狼变的相邻。 解题思路 显然区间dpdpdp&#xff0c;设fi,jf_…

.net的retrofit--WebApiClient库深入篇

前言本篇文章的内容是对上一篇.net的retrofit--WebApiClient库的深层次补充&#xff0c;你可能需要先阅读上一篇才能理解此篇文章。本文将详细地讲解WebApiClient的原理&#xff0c;结合实际项目中可能遇到的问题进行使用说明。库简介WebApiClient是开源在github上的一个httpCl…

Sentinel(三)之如何使用

转载自 Sentinel如何使用 简介 Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard&#xff0c;但是结合 Dashboard 可以取得最好的效果。 这篇文章主要介绍 Sentinel 核心库的使用。如果希望有一个最快最直接的了解&#xff0c;可以参考 新手指…

jzoj4485-[GDOI 2016 Day1]第一题 中学生数学题【数学】

正题 题目大意 给出n0,k,p0n_0,k,p_0n0​,k,p0​ 然后有两问&#xff0c;求 ⌊n0−kp⌋(p−p0)\lfloor n_0-kp\rfloor (p-p_0)⌊n0​−kp⌋(p−p0​)的最大值&#xff0c;ppp为任意实数。⌊n0−kp1⌋(p1−p0)(⌊n0−kp2⌋−n1)(p2−p0)\lfloor n_0-kp_1\rfloor (p_1-p_0)(\lf…

ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

上一篇ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ,我们说过ASP.NET Core中自带的IOC容器是属于轻量级的,功能并不是很多,只是提供了基础功能而已..所以今天我们主要讲讲如何采用Autofac来替换IOC容器,并实现属性注入注意:本文需要读者理解DI IOC并使用过…

Sentinel(四)之工作主流程

转载自 工作主流程 Overview 在 Sentinel 里面&#xff0c;所有的资源都对应一个资源名称&#xff08;resourceName&#xff09;&#xff0c;每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建&#xff0c;也可以通过注解的方式或调用 SphU API…

常用的依赖

<!--指定版本--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version><relativePath/></parent><!--引入插件lombok 自动的set…

在 .NET Core 中的并发编程

原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core今天我们购买的每台电脑都有一个多核心的 CPU&#xff0c;允许它并行执行多个指令。操作系统通过将进程调度到不同的内核来发挥这个结构的优点。然而&#xff0c;还可以通过异步 I/O 操作和…

P5007-DDOSvoid的疑惑【树形dp】

正题 题目链接:https://www.luogu.org/problemnew/show/P5007 题目大意 一棵树每个点有点权(若T0T0T0点权为1&#xff0c;若T1T1T1点权为该点的编号)。求所有不包含祖先关系的集合的点权之和的和。 解题思路 设fif_ifi​表示iii的子树的集合点权之和&#xff0c;gig_igi​表…

配置YML整合Mybatis-映射文件配置

YML基本配置 #端口配置 server:port: 8090#配置数据源 spring:datasource:#如果使用高版本驱动 则添加cjdriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/jt?serverTimezoneGMT%2B8&useUnicodetrue&characterEncodingutf8&autoRe…

Sentinel(五)之流量控制

转载自 流量控制 概述 流量控制&#xff08;flow control&#xff09;&#xff0c;其原理是监控应用流量的 QPS 或并发线程数等指标&#xff0c;当达到指定的阈值时对流量进行控制&#xff0c;以避免被瞬时的流量高峰冲垮&#xff0c;从而保障应用的高可用性。 FlowSlot 会…

jzoj4382-[GDOI2016模拟3.11]历史【并查集】

正题 题目大意 有若干个事件 Kc:cK\ c:cK c:c值更改并且清除生气状态Rxy:R\ x\ y:R x y:新建一条x′x&#x27;x′到y′y&#x27;y′的边&#xff0c;若当前处于生气状态则x(x′n−c)%n,y(y′n−c)%nx(x&#x27;n-c)\%n,y(y&#x27;n-c)\%nx(x′n−c)%n,y(y′n−c)%n&a…

MP实现分页查询

/*** 需求: 实现商品分页查询* param pageResult* return*/Overridepublic PageResult getItemList(PageResult pageResult) {IPage page new Page(pageResult.getPageNum(),pageResult.getPageSize());QueryWrapper<Item> queryWrapper new QueryWrapper<>();//…

ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

上一篇ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)我们讲了如何将默认的容器替换为Autofac,并使用属性注入.那么这一篇我们就来讲讲如何利用Autofac实现我们的AOP(面向切面编程) .1.引用正确的库来实现AOP既然是跨平台,那么在asp.net core因为采…

Sentinel(六)之集群流控

转载自 集群流控 介绍 为什么要使用集群流控呢&#xff1f;假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50&#xff0c;但机器数可能很多&#xff08;比如有 100 台&#xff09;。这时候我们很自然地就想到&#xff0c;找一个 server 来专门来统计总的调用量&#…

P4597-序列sequence【堆】

正题 题目链接:https://www.luogu.org/problemnew/show/P4597 题目大意 一个长度为nnn的序列&#xff0c;每次可以将一个数111或−1-1−1。要求 变成一个非降序列出现的数之前都在原序列 解题思路 我们考虑一下贪心&#xff0c;由于变成一个非降序列&#xff0c;所以肯定越…

Mybatis-Plus基本

Data AllArgsConstructor//全参构造 NoArgsConstructor//无参构造 Accessors(chain true)//链表模式 TableName("User")//映射数据表名 public class User implements Serializable {//序列化传输保证数据完整TableId(type IdType.UUID)//设定主键自增private Inte…

Sentinel(七)之网关限流

转载自 网关限流 Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块&#xff0c;此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑&#xff1a; GatewayFlowRule&…

P1941-飞扬的小鸟【dp】

正题 题目链接:https://www.luogu.org/problemnew/show/P1941 题目大意 n∗mn*mn∗m的场地&#xff0c;一只鸟&#xff0c;在iii格点击一次升XiX_iXi​格(可以点击多次)&#xff0c;不点击掉YiY_iYi​格。不能落地&#xff0c;最高mmm格&#xff0c;然后不能撞到地图上的一些管…