数据结构记录

分块:

prob1:长度为n的数列,n次操作,单点插入,单点/区间查询(假设需要维护的信息可以O(1)维护)

sulution:分块,sqrt(n)次操作后重构,重构O(n),总复杂度O(nlogn)

other_solu:用splay维护即可,O(nlogn),常数大,复杂度允许的话写上面那个

prob2:长度为n的数列,n次操作,每次操作是(l, r, c),询问区间中等于c的有多少个,并将区间都改为c

solution:分块,每块维护一个有序数组和覆盖的lazy标记即可,查询时当前块有标记则O(1)得到答案,否则O(logn)得到,总复杂度是O(n*sqrt(n)*logn)

实际上我们只维护每个块是否是同一个数字,是则O(1)回答,否则暴力查询。若块大小为k,则修改为O(k + n / k),查询为O(n)

但实际上一次操作最多使两个块,由同一个数字的状态变为非同一个数字的状态,所以修改的均摊复杂度是O(n / k)的

k取根号,总复杂度O(n^1.5)

prob3:长度为n的数列,n次询问,问区间众数

solu1(离线):莫队+set,O(n*sqrt(n)*logn)

solu2(在线):参见clj论文(区间众数解题报告)第一种做法,复杂度同上

solu3(在线):clj论文的无修改优化做法,O(n^1.5)

solu4(离线):莫队有个O(n^1.5)的做法,额外维护当前区间出现次数为i的数字有多少个即可,这做法有空间优势,O(n)的空间

能够维护众数出现次数,但无法维护众数是哪个数

prob4:带修改区间众数

solution(在线):参见clj论文,O(n^(5/3))

prob5:查询区间出现正偶数次/正奇数次的数字个数

solu:相当于count在模2意义下的众数

原文地址:https://www.cnblogs.com/ytytzzz/p/10975543.html