BZOJ1558 等差数列】的更多相关文章

题目链接:戳我 实话实话,看了几篇题解真的没看懂,我觉得讲的都有问题.这里对于线段树维护的s写了一点我自己的理解. 看到等差数列,我们考虑对数列做差,这样如果是等差数列,那么值应该相等.(比较容易维护,修改操作就变成了两个单点修改+一个区间修改,如果还是不理解的话可以参考一下代码) 查询比较麻烦,有这样的情况需要考虑: 举个例子-- 1 3 5 6 9 12 它的差分数列为 2 2 1 3 3 最佳选择肯定是(1,3,5)(6,9,12),ans=2 但是我们纯看差分数列找相同的,ans=3 为…
## 本蒟蒻的小整理qwq--持续更新(咕咕咕) 数据结构 数据结构 知识点梳理 数据结构--线段树 推荐yyb dalao的总结--戳我 以后维护线段树还是把l,r写到struct里面吧,也别写len了,调试不好调qwq 初始化和叶节点初始化不太一样qwq,有的需要统一初始化的就一定注意不要写到if(l==r)里面qwq 求区间最大子段和 例题:codevs动态最大子段和 维护区间和,区间前缀最大子段和,区间后缀最大子段和,区间最大子段和.然后合并.(注意这种跨左右子树还有可能会有贡献的线段树…
[BZOJ1558]等差数列(线段树) 题面 BZOJ 题解 可以说这道题已经非常毒瘤了 怎么考虑询问操作? 如果直接将一段数分解为等差数列? 太麻烦了.... 考虑相邻的数做差, 这样等差数列变为了一段连续的相等区间 考虑怎么维护分解一段区间为最少数量的等差数列 事实上,等差数列的第一项不一定要和后面的相等,所以合并的时候要额外考虑 所以,设\(s[0/1/2/3]\)分别表示左右端点是否计算入内 同时维护最左端和最右端的值\(l,r\) 如果没有计算入内,则此时左右端点作为一个等差数列的开头…
题目链接 BZOJ1558 题解 等差数列,当然是差分一下 差分值相同的连续位置形成等差数列,我们所选的两个等差数列之间可以有一个位置舍弃 例如: \(1 \; 2 \; 3 \; 6 \; 8 \; 10\) 差分后是 \(1\; 1\; 3 \; 2\; 2\) 左边两个\(1\)形成等差,右边两个\(2\)形成等差,中间的\(3\)位于两个等差数列的边界,可以舍弃 所以现在问题就转化为了: 在一个区间中选定若干个相同数字的区间,区间之间可以有一个空隙,求最少的区间数 可以用线段树维护 每个…
题目:给定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] 假设要查询区…
Description     约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:"1,4,3,5,7" 很容易看出"1,3,5,7"是等差数列.     给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度. Input     第1行:一个整数N.     第2到N+1行:每行一个整数Ai,表示牛的号码. Output       最长等差数列的长度. Sample Input 5 1 4 3 5 7 Sa…
3357: [Usaco2004]等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 321  Solved: 153[Submit][Status][Discuss] Description     约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:“1,4,3,5,7” 很容易看出“1,3,5,7”是等差数列.     给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度. Inpu…
查找等差数列中的缺失项. e.g.Input: arr[] = {2, 4, 8, 10, 12, 14} Output: 6 Input: arr[] = {1, 6, 11, 16, 21, 31}; Output: 26. 采用binary search. 若是arr[mid] - arr[left] == (mid - left) * diff, 说明missing 部分在mid右侧. 否则missing部分在包括mid的左侧. Time complexity: O(logn). Spa…
例子:  3,8,4,5,6,2          返回值应该为 :5 这是昨天做的一道优酷土豆的编程题,和leetcode中的128/ Longest Consecutive Sequence 有点相似,但是leetcode题的公差是确定的1,而这道题的公差是不确定的. 本人的写出的是一种通过穷举的方法实现查找最长等差数列,通过hash使查找更为方便,减少了复杂度. int calcAPLength(const vector<int> &intAr) // 找数列中,最长的等差数列的…