P2300 合并神犇(单调队列优化dp)
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)相关推荐
- 洛谷 P2300 合并神犇 解题报告
P2300 合并神犇 题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不 ...
- 算法笔记--单调队列优化dp
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...
- poj 2373(单调队列优化dp)
在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...
- poj 1821(单调队列优化dp)
题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)
题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- 【单调队列优化DP】烽火传递 LibreOJ - 10180
题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...
最新文章
- 扫地机器人能有多硬核?好家伙自动驾驶、激光扫描、NLP这些硬科技全上了,科沃斯:技术创新才能打破行业内卷...
- 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
- C#~异步编程续~.net4.5主推的awaitasync应用
- glassfish hk2_使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证
- (pytorch-深度学习系列)CNN二维卷积层-学习笔记
- python之路-08-集合
- 跳槽失败到月薪50K,AI工程师是这样炼成的!
- 微信飞机小游戏java_Shoot Plane 仿微信打飞机游戏的java实现
- Android Verified Boot 2.0 安卓P AVB实现详解
- matlab电磁场 有限元,电磁场有限元Matlab解法.pdf
- 华为S6720系列万兆交换机光模块解决方案
- 基于Python/Socket实现小型的远程木马(包含实验)
- smtp匿名邮件发送小记
- 从google code上clone代码出现 couldn't resolve proxy '(null)' while accessing 的解决方法(2012/12/06)
- 银行卡卡号归属地汇总
- acme申请证书报错:Please update your account with an email address first.的修复方法
- Effective C++ 学习笔记 第二章:构造、析构、赋值运算
- ubuntu16.04编译obmc
- onenote正在与服务器联系以获取信息,随时记录重要信息 – OneNote
- 【10月月赛T9】射命丸文