P2300 合并神犇(单调队列优化dp)

令fif_ifi​​表示前iii​个数的最少合并次数,gig_igi​​表示在fif_ifi​​条件下的最小结尾值。

有转移方程:fi=min(fj+i−j−1),s(j,i)≥gjf_i=min(f_j+i-j-1),s(j,i)\ge g_jfi​=min(fj​+i−j−1),s(j,i)≥gj​

因为:fj+1≤fj+1f_{j+1}\le f_j+1fj+1​≤fj​+1​ 即j+1j+1j+1,fj+1f_{j+1}fj+1​至多会加1, 而jjj加1,i+j−11,i+j-11,i+j−1 必定会减111

因此在满足s(j,i)≥gjs(j,i)\ge g_js(j,i)≥gj​ 的情况下,肯定jjj越大越好。

si−sj≥gj→si≥sj+gjs_i-s_j\ge g_j \rightarrow s_i\ge s_j+g_jsi​−sj​≥gj​→si​≥sj​+gj​。

因此考虑单调队列维护sj+gjs_j+g_jsj​+gj​ ,然后每次选择满足sj+gj≤sis_j+g_j \le s_isj​+gj​≤si​ 的条件下靠近队尾的,因为靠近队尾的jjj更大。

然后维护一个单调递增的单调队即可,注意nodenodenode​ 除了记录sj+gjs_j+g_jsj​+gj​​ ,还要记录jjj​这个ididid​ 便于转移。

另外需要注意的是队列最开始要加入(0,0)(0,0)(0,0)这个结点,因为有可能直接前面所有的数为为一组进行转移。

时间复杂度:O(n)O(n)O(n)

// Problem: P2300 合并神犇
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2300
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-08-10 10:02:52
// --------by Herio--------#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define IOS ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
ll f[N],g[N];
ll a[N];
int n;
int l=1,r=1;//这里相当于加入了(0,0) 因为有可能直接从(0,0) 转移
struct node{int id;ll w;
}q[N];
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]),a[i]+=a[i-1];}for(int i=1;i<=n;i++){while(l+1<=r&&q[l+1].w<=a[i]) l++;f[i]=f[q[l].id]+i-q[l].id-1,g[i]=a[i]-a[q[l].id];while(l<=r&&a[i]+g[i]<=q[r].w) r--;q[++r]={i,a[i]+g[i]};}printf("%lld\n",f[n]);return 0;
}

P2300 合并神犇(单调队列优化dp)相关推荐

  1. 洛谷 P2300 合并神犇 解题报告

    P2300 合并神犇 题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不 ...

  2. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  3. poj 2373(单调队列优化dp)

    在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...

  4. poj 1821(单调队列优化dp)

    题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...

  5. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  6. 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)

    题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...

  7. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  8. POJ 1821 Fence(单调队列优化DP)

    题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...

  9. 【单调队列优化DP】烽火传递 LibreOJ - 10180

    题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...

最新文章

  1. 扫地机器人能有多硬核?好家伙自动驾驶、激光扫描、NLP这些硬科技全上了,科沃斯:技术创新才能打破行业内卷...
  2. 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
  3. C#~异步编程续~.net4.5主推的awaitasync应用
  4. glassfish hk2_使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证
  5. (pytorch-深度学习系列)CNN二维卷积层-学习笔记
  6. python之路-08-集合
  7. 跳槽失败到月薪50K,AI工程师是这样炼成的!
  8. 微信飞机小游戏java_Shoot Plane 仿微信打飞机游戏的java实现
  9. Android Verified Boot 2.0 安卓P AVB实现详解
  10. matlab电磁场 有限元,电磁场有限元Matlab解法.pdf
  11. 华为S6720系列万兆交换机光模块解决方案
  12. 基于Python/Socket实现小型的远程木马(包含实验)
  13. smtp匿名邮件发送小记
  14. 从google code上clone代码出现 couldn't resolve proxy '(null)' while accessing 的解决方法(2012/12/06)
  15. 银行卡卡号归属地汇总
  16. acme申请证书报错:Please update your account with an email address first.的修复方法
  17. Effective C++ 学习笔记 第二章:构造、析构、赋值运算
  18. ubuntu16.04编译obmc
  19. onenote正在与服务器联系以获取信息,随时记录重要信息 – OneNote
  20. 【10月月赛T9】射命丸文

热门文章

  1. FRM计算器使用流程你知道吗?
  2. 中小企业如何选择适合的ERP系统?
  3. [转]九型人格的一句话描述
  4. 计算机毕业设计(附源码)python校园食堂订餐系统项目运行
  5. 经典推荐——计算机科学殿堂的知识瑰宝
  6. 合伙创业协议书标准模板
  7. (教程)3DS MAX游戏场景建模基础教程
  8. springboot中maven文件pom.xml的<resource>下的<includes>和<excludes>
  9. 搭建网站选择租用哪里的服务器
  10. 大疆 三维建模 正射影像 价格