当前位置: 首页 > news >正文

[BZOJ] 2006: [NOI2010]超级钢琴

题意:给一个序列,问长度为L~R的子串和中前k大的和

对于O(n^2)的区间枚举,考虑枚举一个点,计算另一个点

于是枚举左端点,计算出在范围内且使区间和最大的右端点(ST表完成)

这时候的最大值一定是全局最大值,取出后考虑以该左端点为左端点的区间次大值,设原区间在右端点y处取到最大,则将y删去后的两个区间有可能取到次大值,加入堆即可

复杂度O(nlogn)

 

ST表的边界一定要注意!log2能手写就手写咯

#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>

using namespace std;

inline int rd(){
  int ret=0,f=1;char c;
  while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
  while(isdigit(c))ret=ret*10+c-'0',c=getchar();
  return ret*f;
}

const int MAXN = 1000005;

int n,m,L,R;
int sum[MAXN],f[2*MAXN][33],g[2*MAXN][33];

int lg2(int x){
  int ret=1;
  while((1<<ret)<x)ret++;
  return ret-1;
}
int query(int l,int r){
  if(l==r)return g[l][0];
  int len=lg2(r-l+1);
  return f[l][len]<f[r-(1<<len)+1][len]?g[r-(1<<len)+1][len]:g[l][len];
}

struct Node{
  int x,y,l,r;
  Node(int _x=0,int _l=0,int _r=0){
    x=_x;l=_l;r=_r;
    y=query(l,r);
    // cout<<"Push:"<<x<<" "<<y<<" "<<l<<" "<<r<<endl;
  }
  bool operator <(const Node &rhs)const{
    return sum[y]-sum[x-1]<sum[rhs.y]-sum[rhs.x-1];
  }
}tmp;
priority_queue<Node> Q;
int main(){
  n=rd();m=rd();L=rd();R=rd();
  for(int i=1;i<=n;i++){
    sum[i]=sum[i-1]+rd();
    f[i][0]=sum[i];g[i][0]=i;
  }
  for(int j=1;(1<<j)<=n;j++){
    for(int i=1;i<=n;i++){
      if(f[i][j-1]>f[i+(1<<(j-1))][j-1]){
        f[i][j]=f[i][j-1];
        g[i][j]=g[i][j-1];
      }else{
        f[i][j]=f[i+(1<<(j-1))][j-1];
        g[i][j]=g[i+(1<<(j-1))][j-1];
      }
    }
  }
  for(int i=1;i+L-1<=n;i++){
    int l=i+L-1,r=i+R-1;
    r=min(r,n);
    Q.push(Node(i,l,r));
  }
  long long ans=0;
  int cnt=0;
  int x,y,u,v;
  while(cnt<m){
    tmp=Q.top();Q.pop();
    x=tmp.x,y=tmp.y,u=tmp.l,v=tmp.r;
    // cout<<x<<" "<<y<<endl;
    ans+=sum[y]-sum[x-1];
    if(y-1>=u){Q.push(Node(x,u,y-1));}
    if(y+1<=v){Q.push(Node(x,y+1,v));}
    cnt++;
  }
  cout<<ans;
  return 0;
}

 

转载于:https://www.cnblogs.com/ghostcai/p/9670154.html

相关文章:

  • MTV框架和django基本命令
  • MySQL5.6 主从复制 ERROR 1776 (HY000): Parameters MASTER_LOG_FILE
  • 设计模式代理
  • [国家集训队]Crash的文明世界
  • 说说 C 语言编程利器 CLion
  • Netty系列文章之构建HTTP(HTTPS)应用程序
  • 配置Redis客户端
  • c# 读取blob数据
  • 一文详解达观数据知识图谱技术与应用——技术直播回顾
  • shell日志颜色处理
  • 关于矩阵自由度的解释
  • 使用包和测试
  • 2018 noip 考前临死挣扎
  • vue增加按钮到表头单元格的解决方法
  • PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.19. 在线程化程序中的行为...
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 自己简单写的 事件订阅机制
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • java2019面试题北京
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript设计模式之工厂模式
  • JavaWeb(学习笔记二)
  • java取消线程实例
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • python大佬养成计划----difflib模块
  • React-redux的原理以及使用
  • 官方解决所有 npm 全局安装权限问题
  • 近期前端发展计划
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端面试题总结
  • 如何选择开源的机器学习框架?
  • 思考 CSS 架构
  • 线性表及其算法(java实现)
  • 写代码的正确姿势
  • 一些关于Rust在2019年的思考
  • $ git push -u origin master 推送到远程库出错
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (转)EOS中账户、钱包和密钥的关系
  • (转)编辑寄语:因为爱心,所以美丽
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .net core 6 redis操作类
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .Net IOC框架入门之一 Unity
  • .net 调用php,php 调用.net com组件 --
  • .NET 设计模式初探
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net6 webapi log4net完整配置使用流程
  • .NET牛人应该知道些什么(2):中级.NET开发人员