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=gcd(a,b) \]

\[a=a'*k\quad b=b'*k \]

\[a-b=(a'-b')*k \]

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)\)

posted @ 2023-07-17 14:49  Linnyx  阅读(25)  评论(0)    收藏  举报