等差数列 为了检验学生的掌握情况,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). 在焦头烂
mdzz,这道题重构了4遍,花了一个晚上... 满足等差数列的条件: 1. 假设min是区间最小值,max是区间最大值,那么 max-min+k(r−l) 2. 区间相邻两个数之差的绝对值的gcd=k 3. 区间没有重复的数 前两个条件直接线段树就好啦:而第三个条件:对于每个权值开个set,值为位置(离散化)然后维护一个pp[i],表示当前a[i]这个值,在i前面最后一次出现的位置. 那么满足第3个条件,当且仅当区间[l,r]的 max { pre[ i ] } ( l <= i <= r )