【ybtoj】【单调队列入门专题】 前言学习一个新的算法,总是要仔细考虑一些深入的问题,而不要过度追求速度 单调队列是一个主要用来优化 dp 的算法,所以先想出 dp 转移式子,再通过单调队列优化掉一维的复杂度才是正常的打开方式,而不是硬想单调队列怎么做 一般来说,在 dp 式子里有一维"在一个向某一个方向单调移...
单调队列 T2,应用题 正文 F(i)=max(∑j=i−k+1iAj)(1≤k≤m)=max(si−si−k)=si−min(si−k) 单调队列维护min即可 代码 #include <bits/stdc++.h>using namespace std; constintN=1e6+6;intn,m,s[N],q[N];intmain(){ cin>>n>>m;for(inti=1;i<=n;i++){ cin>>s[i]...
总DP 式:\(dp_i = \min\limits_{j=pre_{i-1}}^{i-1}\{dp_j\}+w_i\). 显然,强制使\(pre\)单调不降后,答案必定成立。 这样,可以使用单调队列来优化 dp . 关于为什么\(j\)的左端点不可取\(pre_i\): 由于点\(i\)表示右端点是\(i\)的线段,这些线段会被\(i\)覆盖,而不是\(j\). ...
【YBTOJ】【单调队列】粉刷木板 粉刷木板 有\(N\) 块木板从左到右排成一行,有 \(m\) 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次。 第\(i\) 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 且长度不超过 \(L_i\) 的连续的一段木板,每粉刷一块可以得到 \(P_i\) 的报酬。不同工匠的 \(S_...
【ybtoj】【单调队列】写博客 题意小泽发了一篇博客,由 n 个小写英文字母组成,由于包含违禁词,被自动隐藏。 具体地,违禁词有 m 个,分别为 T1,T2,…,Tm 。 小泽发现,只要博客中,连续地包含了其中违禁词,那么博客就会被自动隐藏。换言之,对于任意 1≤i≤m , Ti 都不能是最终发表的博客 S 的子串。 于是...
显然dpidpi 是单调不减的,那么一定当 jj 取值kiki 时, dp 值取最小。 对于队列内的多个元素,则需要对每对相邻元素都求其对应的 dp+maxadp+maxa, 利用数据结构来快速找到这些值中最小的那一个,即为 dpidpi。 最后,考虑原 dpdp 式中jj 的取值范围。显然 jj 满足i∑k=j+1≤m∑k=j+1i≤m,且 j<ij...
【ybtoj】【单调队列】出题方案 题意 现在小泽的手上有 n 道难题,编号分别为 1∼n ,第 i 道题的难度系数是 ai 。 小泽想用这些题出比赛,他会把题目按照编号划分为若干个非空连续区间,每个区间对应了一场比赛。 特别的,如果某场比赛的题目难度系数之和超过了给定的常数 m ,这场比赛会过于毒瘤,所以他不...
题目链接:ybtoj高效进阶 21261 题目大意 给你一个数组,然后问你最多能分成多少段,使得每一段的值不增。 每一段的值是这一段的数的和。 思路 首先我们把序列翻转,变成要单调不降。 然后考虑 DP,设\(f_{i,j}\)为把前\(i\)个数最多能分成多少段(最后一段是\(j+1\sim i\))。
题目链接:ybtoj高效进阶 21266题目大意给你n 个事件,每个事件有收益,时间,然后你可以选不超过 k 个事件,要求你选的两个相邻的事件相差的时间要在 p~q 之间,然后每个事件还有一个数值 di,如果你选出来的事件中相邻的两个有因子 t,那贡献就要减去 z。 然后问你最大贡献是多大。
题目链接:ybtoj高效进阶 21167 题目大意 给你一个基环树。 然后你可以在环上选一个边删掉,然后使它变成树。 一棵树的贡献是它里面最长路径。 然后要你求可以有的树的贡献的最大值。 思路 首先第一步考虑找到环。 (用类似 tarjan 找环) 然后对于环上的每个点,它们会挂着一些树,那我们就要求它这个树内部的...