bzoj1558】的更多相关文章

[BZOJ1558]等差数列(线段树) 题面 BZOJ 题解 可以说这道题已经非常毒瘤了 怎么考虑询问操作? 如果直接将一段数分解为等差数列? 太麻烦了.... 考虑相邻的数做差, 这样等差数列变为了一段连续的相等区间 考虑怎么维护分解一段区间为最少数量的等差数列 事实上,等差数列的第一项不一定要和后面的相等,所以合并的时候要额外考虑 所以,设\(s[0/1/2/3]\)分别表示左右端点是否计算入内 同时维护最左端和最右端的值\(l,r\) 如果没有计算入内,则此时左右端点作为一个等差数列的开头…
题目链接 BZOJ1558 题解 等差数列,当然是差分一下 差分值相同的连续位置形成等差数列,我们所选的两个等差数列之间可以有一个位置舍弃 例如: \(1 \; 2 \; 3 \; 6 \; 8 \; 10\) 差分后是 \(1\; 1\; 3 \; 2\; 2\) 左边两个\(1\)形成等差,右边两个\(2\)形成等差,中间的\(3\)位于两个等差数列的边界,可以舍弃 所以现在问题就转化为了: 在一个区间中选定若干个相同数字的区间,区间之间可以有一个空隙,求最少的区间数 可以用线段树维护 每个…
好题,初看以为只要差分然后维护相同的段数目但是请注意下面的情况2 3 5 8 9 1 2 3 4 这显然答案是3而不是4因此我们还要再维护ld,rd表示左右单独的段长度和s表示不包括左右单独的段,中间部分最少划分成几个等差数列具体维护见程序,比较复杂,但其实不难这题还有一个坑爹的地方,我一开始忘开int64本地测数据竟然全能过但是交上去就WA……感人肺腑 type node=record l,r:int64; ld,rd,s:longint; end; ..*] of node; lazy:..…
题目:给定n个数,m个操作,每次给一段区间加一个等差数列或者询问一段区间至少要用多少个等差数列来表示.$n,m\leqslant 10^{5}$ 题解:老套路,维护差分数组,修改操作变成了两个单点加和一个区间加.然后我们用线段树维护,合并答案的时候复杂一点,s[0/1][0/1]表示左右端点取不取的答案就行啦. #include<iostream> #include<cstdio> #define MN 100000 using namespace std; inline int…
题面 首先感谢这篇题解,是思路来源 看到等差数列,就会想到差分,又有区间加,很容易想到线段树维护差分.再注意点细节,\(A\)操作完美解决 然后就是爆炸恶心的\(B\)操作,之前看一堆题解的解释都不怎么明白,就自己脑补+看上面那篇题解乱搞出了个相对合理点的解释-- 用\(0/1/2/3\)分别表示一个差分区间统计答案时,是否跨越原区间左右端点.\(s[0/1/2/3]\)分别表示每个状态的最少可以划分出来的等差数列个数. 合并方式如下: /*定义差分b[i]=a[i+1]-a[i] 假设要查询区…
题目链接:戳我 实话实话,看了几篇题解真的没看懂,我觉得讲的都有问题.这里对于线段树维护的s写了一点我自己的理解. 看到等差数列,我们考虑对数列做差,这样如果是等差数列,那么值应该相等.(比较容易维护,修改操作就变成了两个单点修改+一个区间修改,如果还是不理解的话可以参考一下代码) 查询比较麻烦,有这样的情况需要考虑: 举个例子-- 1 3 5 6 9 12 它的差分数列为 2 2 1 3 3 最佳选择肯定是(1,3,5)(6,9,12),ans=2 但是我们纯看差分数列找相同的,ans=3 为…
线段树 by yyb Type1 维护特殊信息 1.[洛谷1438]无聊的数列 维护一个数列,两种操作 1.给一段区间加上一个等差数列 2.单点询问值 维护等差数列 不难发现,等差数列可以写成\(ad+b\)的形式 因为具有可加性 所以维护一下这个类似于斜率的东西 每次下放的时候把数列拆分成两段,\(d\)值公差不变 而变化的只有后面的常数项 至于如何只在一段区间内维护等差数列 相当于在当前\([l,n]\)位置维护这一段公差为\(d\)的等差数列 再在\([r+1,n]\)维护一个负公差就行了…
## 本蒟蒻的小整理qwq--持续更新(咕咕咕) 数据结构 数据结构 知识点梳理 数据结构--线段树 推荐yyb dalao的总结--戳我 以后维护线段树还是把l,r写到struct里面吧,也别写len了,调试不好调qwq 初始化和叶节点初始化不太一样qwq,有的需要统一初始化的就一定注意不要写到if(l==r)里面qwq 求区间最大子段和 例题:codevs动态最大子段和 维护区间和,区间前缀最大子段和,区间后缀最大子段和,区间最大子段和.然后合并.(注意这种跨左右子树还有可能会有贡献的线段树…