题目:[NOI2010] 超级钢琴

前求出美妙值的前缀和,然后倍增处理一下前缀和的最大值,然后对于一个左端点s,他能取到右端点的只有s+l到s+r,而他的最大贡献就是s+l 到s+r的最大子段和,因此可以直接维护,然后用个堆维护总和最大值,这道题就做完了。

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#define int long long
const int N=5e5+5;
using namespace std;
int n,m,L,R,f[N][20],a[N],sum[N],lg[N];
namespace ST
{
void init()
{
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
{
int s1=f[i][j-1],s2=f[i+(1<<(j-1))][j-1];
if(sum[s1]>=sum[s2])
f[i][j]=s1;
else
f[i][j]=s2;
}
}
int query(int l,int r)
{
int j=lg[r-l+1];
int s1=f[l][j],s2=f[r-(1<<j)+1][j];
if(sum[s1]>=sum[s2])
return s1;
else
return s2;
}
}
using namespace ST;
struct pos
{
int o,l,r,val,maxp;
pos(int oo,int ll,int rr)
{
o=oo;l=ll;r=rr;
maxp=query(l,r);
val=sum[maxp]-sum[o-1];
}
pos(){
}
friend bool operator < (pos a,pos b)
{
return a.val<b.val;
}
};
priority_queue <pos> q;
signed main()
{
scanf("%lld %lld %lld %lld",&n,&m,&L,&R);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
f[i][0]=i;
sum[i]=sum[i-1]+a[i];
}
for(int i=2;i<=n;i++)
lg[i]=lg[i>>1]+1;
init();
for(int i=1;i<=n;i++)
if(i+L-1<=n)
q.push(pos(i,i+L-1,min(i+R-1,n)));
int ret=0;
for(int i=1;i<=m;i++)
{
pos now=q.top();
q.pop();
ret+=now.val;
if(now.maxp-1>=now.l)
q.push(pos(now.o,now.l,now.maxp-1));
if(now.maxp+1<=now.r)
q.push(pos(now.o,now.maxp+1,now.r));
}
printf("%lld\n",ret);
return 0;
}

2022春每日一题:Day 40的更多相关文章

  1. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  2. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  3. 【Java每日一题】20170105

    20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  4. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  5. 【Java每日一题】20170103

    20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  6. 【Java每日一题】20161230

    // 20161229问题解析请点击今日问题下方的"[Java每日一题]20161230"查看(问题解析在公众号首发,公众号ID:weknow619)package Dec2016 ...

  7. 【Java每日一题】20161229

    package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1229 { public s ...

  8. 【Java每日一题】20161228

    package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1228 { public s ...

  9. 【Java每日一题】20161227

    package Dec2016; public class Ques1227 { public static void main(String[] args){ } { c = 1; } int c ...

  10. 【Java每日一题】20161226

    package Dec2016; public class Ques1226 { static{ num = 1; } public static int num = 2; public static ...

随机推荐

  1. HCNP Routing&Switching之IP安全

    前文我们了解了DHCP安全相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16637627.html:今天我们来聊一聊IP安全相关话题: 技术背景 随着 ...

  2. [Python]-string-字符串

    字符串是Python中很常用的数据类型,此处记录一些典型用法并随时更新. split()方法 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串. 两个参数st ...

  3. Docker(一):初识

    1.什么是Docker   Docker 是一个基于Go 语言并遵从Apache2.0协议开源的.轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建.管理和编排容器.可以让开发者打 ...

  4. vscode常用快捷键及插件

    macOS 全局 Command + Shift + P / F1 显示命令面板 Command + P 快速打开 Command + Shift + N 打开新窗口 Command + W 关闭窗口 ...

  5. 基于 OpenTelemetry 的链路追踪

    链路追踪的前世今生 分布式跟踪(也称为分布式请求跟踪)是一种用于分析和监控应用程序的方法,尤其是使用微服务架构构建的应用程序.分布式跟踪有助于精确定位故障发生的位置以及导致性能差的原因. 起源 链路追 ...

  6. 2.2 virtualenv 虚拟环境

    有的时候因为各种原因,在操作系统下,我们会安装很多版本的Python解释器.同样,我们也有可能因为各种原因,需要不同版本的模块,比如Django1.8,Django1.11.再加上pip工具管理器的版 ...

  7. Elasticsearch:正确使用regexp搜索

  8. nexus迁移

    1.找到nexus主目录和sonatype-work目录打包,一般在 /usr/local/nexus 和 /usr/local/sonatype-work # tar -czvf nexus.tar ...

  9. 从dva到vuex的使用方法()

    官网文档:https://vuex.vuejs.org/zh/ 辅助理解的博客:https://blog.csdn.net/m0_70477767/article/details/125155540 ...

  10. Java 基础三、接口与内部类

    1.   在Java程序语言中,接口是对类的一种描述.例如Arrays类中sort方法声明可以对对象进行排序,但前提是对象所属的类必须实现Comparable接口. public interface ...