7.17 数据结构
线段树
小白逛公园
动态维护最大子段和,没啥好说的
文文的摄影布置
考虑清楚标记分讨合并
算术天才⑨与等差数列
维护区间最大最小,如果是等差数列,有了端点就可以知道整个序列了,再维护哈希值对比就可以了,突然发现我之前这个解法是乱搞,只有充分性没有必要性,只是题目没有卡
正解:
维护原序列差分数组,如果是等差数列,差分值应该都是k的倍数,所以我们可以去维护差分数组的gcd
再维护区间max,min,他们应该满足max-min=(r-l)*k
最后维护区间无重复数字,具体的,我们维护区间max pre,pre指的是左边第一个和他相等数字位置,查询时比较与l关系判断有无重复数字,对每种值开个set,修改时lower_bound查询即可
DGCD
长为n的序列,m次操作
1.区间加
2.询问区间gcd
区间gcd有个性质,即区间gcd等于区间差分数组gcd
我们知道,求区间gcd时可以依次把每个值gcd起来,那么考虑在序列上
假设a,b是相邻的两个数字
k仍是因子
那么区间加就变成了在差分数组上的单点修改,用线段树维护即可
[SHOI2015] 脑洞治疗仪
区间覆盖,维护最长连续和最长前后缀,就可以信息和并了,对于拿一段区间去填补另一区间的操作,可以先查要拿区间1个数,然后区间覆盖成0,在待填区间二分一个值使区间左端点到mid,0个数正好为拿区间的1个数,然后区间覆盖成1
时间复杂度:\(O(nlog^2n)\)
Trie
[Ynoi Easy Round 2021] TEST_68
考虑任取整棵树亦或最大的两个点,\(x,y\),那么x子树,y子树,x到lca路径上的子树,y到lca路径上的子树答案就是\(a_x \oplus a_y\)
此时只剩下x到lca,y到lca,lca到根上的点
STL
合并果子 加强版
桶排,再开一个队列记录合并出的果子,都是单调不降的
序列合并
没啥可记的,简单思路题
并查集
?题
区间把没涂色的地方涂上色,并查集套路,染色后就把父亲指向右边位置
线性并查集:
对于刚刚那个序列,按logn分块,只有块内被染色才合并,用lowbit算出块内最靠左的第一个没染色的位置
几乎线性
LCA
Max Flow P
树上差分,只需求lca,时间复杂度\(O(nlogn)\)
n比较小,也可以无脑树链剖分,时间复杂度\(O(nlog^2n)\)