线段树选做
LOJ6029:
主要操作为区间除法,考虑到向下取整并且要求区间和
直接标记并对sum进行操作显然是假的
这里首先是一类线段树问题的套路,基本形式为区间除法
区间开根(听OMA说还有一道题为将区间内所有数转化为其约
数个数),对于这一类问题我们发现并不好维护信息,然而同
一元素收到的操作数十分有限,于是可以暴力进行操作,在线
段树上表示一段区间是否已经不能操作即可
然而本题还有区间加操作,复杂度并没有保证,貌似需要
大力卡常,考虑另一类经典套路:操作转化,发现操作本质为
将a变为a / div,其中变化量为a - a / div,可以发现类似上面的
思路,对于一段区间若其权值处于一定范围,那么变化量相同
于是可以维护出区间最大最小值,每次操作判断最大值最小值
变化量是否相同,若相同则转化为区间减法操作
CF242E:
考虑首先我的思路为一个经典结论:a + b = a ^ b + 2 * (a & b)
考虑将其拓展再转化加法与异或的关系,然而并不会拓展。
于是考虑的是按位操作,发现可以将一段区间的和转化为二进制
下每一位的数量,区间异或即为二进制下某些位的数量反转
线段树每个节点暴力维护一段区间的二进制位信息即可
CF620E:
确实很水,考虑60这一关键信息,longlong进行位运算维护
从属关系即可
CF240F:
考虑字符串统计问题的一种套路,由于字符串一般只有少量字母
即字符集一般为26,那么可以考虑字母分治
具体来说,对于DP问题可以增加以为表示当前考虑的是字母j,
而本题而言,考虑首先判断区间是否可行,可以想到统计每种字母出
现次数,而构成回文操作实际上是区间推平操作,于是可以利用线段
树维护,考虑在一颗线段树上统计26个字母的信息并不容易实现,因
此开26棵线段树维护每种字母在序列中的出现情况,于是区间查询,
区间赋值即可