[bzoj1558][JSOI2009]等差数列】的更多相关文章

题目链接 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] 假设要查询区…
[BZOJ1558]等差数列(线段树) 题面 BZOJ 题解 可以说这道题已经非常毒瘤了 怎么考虑询问操作? 如果直接将一段数分解为等差数列? 太麻烦了.... 考虑相邻的数做差, 这样等差数列变为了一段连续的相等区间 考虑怎么维护分解一段区间为最少数量的等差数列 事实上,等差数列的第一项不一定要和后面的相等,所以合并的时候要额外考虑 所以,设\(s[0/1/2/3]\)分别表示左右端点是否计算入内 同时维护最左端和最右端的值\(l,r\) 如果没有计算入内,则此时左右端点作为一个等差数列的开头…
Description Solution 把原数组变为差分数组,然后剩下的就十分显然了 区间查询用线段树维护 修改操作就是区间加法和两个单点修改 一个等差数列实际上就是 开头一个数字+数值相等的一段 唯一的难点在于讨论这个开头的数字的去向 在线段树合并的时候 \(mid\) 左右两个元素如果相等的话是可以合并的,所以还需要做讨论 所以我们可以先不把左右两端点列入考虑对象,然后在合并时再讨论去向,综上需要维护的东西有: 1.区间的左右两个端点都不列入考虑的等差数列数量 2.区间的左端点列入考虑 3…
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B_r\)-=\((r-l)*d+a_0\),\(B_{l...r-1}\)+=\(d\). 对于查询,似乎只需要求区间\(b_i\)的连续段个数? 并不是,比如: \(A:\ 0\ 1\ 3\ 6\ 10\\B:\ \ \ 1\ 2\ 3\ 4\) 答案是\(3\)而不是\(4\),我们可以这样划分…
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1558 题解: 考虑这么用线段树进行维护,由于他有区间修改等差数列 很容易想到可以用差分数组来维护(这东西经常和数据结构用在一起) 那么每一次的区间修改就变成了单点修改 另外我们可以利用线段树来维护: h---t区间等差数列个数,h----(t-1)区间等差数列个数,(h+1)---t区间等差数列个数 为了维护这三个值,要引入(h+1)-----(t-1)(这个转移非常巧妙) 为什么要维护这些…
等差数列 为了检验学生的掌握情况,jyy布置了一道习题:给定一个长度为N(1≤N≤100,000)的数列,初始时第i个数为vi(vi是整数,−100,000≤vi≤100,000),学生们要按照jyy的给出的操作步骤来改变数列中的某些项的值.操作步骤的具体形式为:A s t a b (s,t,a,b均为整数,1≤s≤t≤N,−100,000≤a,b≤100,000),它表示,在序列的[s,t]区间上加上初值为a,步长为b的等差数列.即vi变为vi+a+b×(i−s)(对于s≤i≤t). 在焦头烂…
前言: 这题真ex... 强烈谴责在题解里面放毒瘤题链接的屑出题人! 吐 ️ 解析: 这题分成两步走. 首先,既然题目中的修改操作是区间加等差数列,那么就容易想到在差分数组上进行操作. 然后就是相当恶心的查询. 转化到差分数组上,相信会有一部分小朋友会向我一样,傻乎乎的以为就是求一个区间极大相同连续段个数... 其实我是联想到了这个题..虽说线段树维护的思路是相似的,但是显然这道黑题比那个树剖难维护的多... 回到这个题.刚才说到,求区间极大相同连续段个数其实是不行的. 因为可以发现下面的数组:…
线段树 by yyb Type1 维护特殊信息 1.[洛谷1438]无聊的数列 维护一个数列,两种操作 1.给一段区间加上一个等差数列 2.单点询问值 维护等差数列 不难发现,等差数列可以写成\(ad+b\)的形式 因为具有可加性 所以维护一下这个类似于斜率的东西 每次下放的时候把数列拆分成两段,\(d\)值公差不变 而变化的只有后面的常数项 至于如何只在一段区间内维护等差数列 相当于在当前\([l,n]\)位置维护这一段公差为\(d\)的等差数列 再在\([r+1,n]\)维护一个负公差就行了…