杂题刷刷刷

一句话题解

有很多题想法很巧妙,但实在懒得码了 ,特此记录一下

函数的魔法

题目

对于数x,两种操作:\(x=(x*x*x+x*x) mod 233\)\(x=(x*x*x-x*x) mod 233\),求最少的操作次数将x变成y

题解

可达矩阵

求出233*233的可达矩阵\(A^1\),预处理出\(A^1 \sim A^{233}\) (最多计算233次),然后每次遍历233个矩阵就行

老瞎眼 pk 小鲜肉

题目

q次询问,询问[L,R]内最短异或和为0的区间

题解

没有实际操作,但感觉可以离线询问 莫队或者线段树,题解都是线段树就介绍线段树吧,比较保险

首先预处理O(n)求出a[i]作为区间右端点时最近的左端点 \(left[i]\)(map存一下之前相同值的位置,相减再更新就行),离线询问,按照右端点从小到大排序,每次把每个询问区间右端点R之前的值都插入到线段树中,将每个a[i]的长度更新到 \([1,left[i])\)

总结

似乎离线排序询问,再按照右端点排序,然后把右端点前的值进行线段树更新是一个比较常见的套路,至少遇到过两次了,事不过三,下次碰到绝对不能没有思路了

小阳的贝壳

题目

长度为n的数组,3种操作:

  • \([l,r]\) 操作:+x
  • \([l,r]\) 询问:\(max(abs(a[i+1]-a[i]))\)
  • \([l,r]\) 询问:最大公约数

题解

线段树

虽然我是队伍里的数据结构手,但数据结构真的实在太难学了,变化层出不穷,大部分都得靠赛前的积累,赛中大概率是想不出来的,这道题用的是 将数组先化为差分数组,再建树

解决:

  • 单点修改,差分数组的常规操作

  • 区间询问,差分数组更好做了

  • \(gcd(a,b)=gcd(a,a-b)\)\(gcd(a_l,a_{l+1},…,a_r)=gcd(a_l,a_{l+1}-a_l,…,a_r-a_{r-1})\)

    所以\(gcd(a_l,gcd_b)\)就是题目的解,\(gcd_b\)就是差分数组的gcd,\(a_l\)\(\sum_{i=1}^l b_i\) ,所以可以维护一个sum

维护的有三个:sum,abs,gcd就够了,单点更新+区间询问