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

洛谷P1714 切蛋糕(单调队列经典问题)

传送门


一开始很容易想到尺取,但是好像又不太一样,尺取解决的一般是区间和接近某个数或者区间内讨论数的种类个数,而本题实际上是解决最大不定长连续子段和

然后不难想到最大连续和的经典问题,然后不难想到前缀和的 O ( n 2 ) O(n^2) O(n2)算法,显然会 T L E TLE TLE,那么参考最大连续和的前缀和优化:

假设以第 j j j个数为终点的最大子序列和的起点是 i i i,于是结果为 s u m [ j ] − s u m [ i − 1 ] sum[j] - sum[i-1] sum[j]sum[i1]。因为我们要维护最大前缀和, s u m [ i − 1 ] sum[i-1] sum[i1]必然是 s u m [ 1 ] , s u m [ 2 ] , . . . , s u m [ j − 1 ] sum[1],sum[2],...,sum[j-1] sum[1],sum[2],...,sum[j1]中的最小值。这样,如果在维护计算 s u m sum sum数组的时候,同时维护之前的最小值, 那么就可以求出最大连续和。时间复杂度 O ( n ) O(n) O(n)

但是本题并不是保存每个位置前缀和的最小值,因为限定区间长度为 m m m,那么仔细想想也就是每个位置前面长度为 m m m前缀和的最小值,这不就是经典的单调队列问题——滑动窗口的最小值吗,那么使用前缀和+单调队列即可

ps:因为区间[l,r]的和为前缀和sum( r )-sum(l-1),因此实际上取的m为m+1,需要注意

#include <bits/stdc++.h>
#include <unordered_map>
#include <unordered_set>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define Vector Point
#define lowbit(x) (x&(-x))
#define mkp(x,y) make_pair(x,y)
#define mem(a,x) memset(a,x,sizeof a);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const double dinf=1e300;
const ll INF=1e18;
const int Mod=1e9+7;
const int maxn=5e5+10;

int a[maxn],q[maxn];

int main(){
    //freopen("cake.in","r",stdin);
    //freopen("cake.out","w",stdout);
    ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i]+=a[i-1];
    }
    m++;
    int l=0,r=0,ans=-inf;
    for(int i=1;i<=n;i++){
        while(l<r && i-q[l]+1>m) l++;
        while(l<r && a[i]<a[q[r-1]]) r--;
        q[r++]=i;
        ans=max(ans,a[i]-a[q[l]]);
        //cout<<ans<<endl;
    }
    cout<<ans<<"\n";
    return 0;
}

相关文章:

  • 磁盘文件的正常读写与异步读写
  • 洛谷P1725 琪露诺(单调队列+dp)
  • Linux wait_on_buffer函数研究
  • POJ - 2796 Feel Good(经典单调栈)
  • 基于Linux0.11源代码的操作系统内核典型处理过程分析1
  • POJ - 3494 Largest Submatrix of All 1’s(单调栈+降维)
  • 在批处理文件中实现按日期命名的目录迁移
  • HDU - 6806 Equal Sentences(dp)
  • UltraWinGrid自适应列宽/行高
  • HDU - 6812 Kindergarten Physics(分块/规律)
  • UltraGrid 卡片模式列自适应宽度
  • 2020牛客暑期多校第七场 B - Mask Allocation(思维)
  • 编程修改BIN等二进制文件
  • 2020牛客暑期多校第七场 H - Dividing(整除分块)
  • 2020牛客暑期多校第八场 K - Kabaleo Lite(贪心)
  • codis proxy处理流程
  • C学习-枚举(九)
  • Java-详解HashMap
  • scala基础语法(二)
  • Yii源码解读-服务定位器(Service Locator)
  • 从零搭建Koa2 Server
  • 你不可错过的前端面试题(一)
  • 前端js -- this指向总结。
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 源码安装memcached和php memcache扩展
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (145)光线追踪距离场柔和阴影
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .Net多线程总结
  • .NET学习教程二——.net基础定义+VS常用设置
  • @AutoConfigurationPackage的使用
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [1181]linux两台服务器之间传输文件和文件夹
  • [BIZ] - 1.金融交易系统特点
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [CISCN2019 华东南赛区]Web11
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [CTSC2014]企鹅QQ
  • [Electron]ipcMain.on和ipcMain.handle的区别
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总
  • [jQuery]使用jQuery.Validate进行客户端验证(中级篇-上)——不使用微软验证控件的理由...
  • [Linux]创建新用户并授予root权限
  • [Luogu 3958] NOIP2017 D2T1 奶酪
  • [Mac软件]Goldie App v2.2 Mac黄金比例设计工具
  • [nlp] 损失缩放(Loss Scaling)loss sacle
  • [NOIP2000] 乘积最大