数据结构记录
分块:
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意义下的众数