分块:数组
prob1:长度为n的数列,n次操做,单点插入,单点/区间查询(假设须要维护的信息能够O(1)维护)优化
sulution:分块,sqrt(n)次操做后重构,重构O(n),总复杂度O(nlogn)io
other_solu:用splay维护便可,O(nlogn),常数大,复杂度容许的话写上面那个重构
prob2:长度为n的数列,n次操做,每次操做是(l, r, c),询问区间中等于c的有多少个,并将区间都改成c查询
solution:分块,每块维护一个有序数组和覆盖的lazy标记便可,查询时当前块有标记则O(1)获得答案,不然O(logn)获得,总复杂度是O(n*sqrt(n)*logn)co
实际上咱们只维护每一个块是不是同一个数字,是则O(1)回答,不然暴力查询。若块大小为k,则修改成O(k + n / k),查询为O(n)数字
但实际上一次操做最多使两个块,由同一个数字的状态变为非同一个数字的状态,因此修改的均摊复杂度是O(n / k)的play
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意义下的众数