省选武汉联测2
lxl专场
A.After god
回滚莫队,然后按照左端点所在块的所有值进行值域分块,每个值为有一个块的左端点,然后用一个int维护最低的log位,移动右端点均摊 \(O(n)\),左端点单次加 \(O(1)\),进位均摊 \(O(\sqrt n)\),多维护一个数组部分的连续前缀1的个数就能计算答案了.然而我是暴力压位过的
B.魔法少女
先按 \(C\) 分块,处理整块的最大子区间和,然后处理相邻块的贡献,没懂.
C.愚者之夜
口胡是比较顺畅的,但是看了一眼std三百行还是算了吧
考虑分别处理每种颜色的贡献,对于每种颜色跑一次回滚莫队,用一个类似并查集,或者链表的东西维护一下连续段,贡献就是所有连续段长度的平方的和,直观上好像 \(n \sqrt m\) 直接过了,但是实际上每次都要 \(O(m)\) 扫一遍询问,颜色数多了就寄了.考虑进行根号分治,对于出现次数大于根号的颜色,仍然跑回滚处理,这一部分是 \(O(n \sqrt(m) + m \sqrt(n))\) 的,对于出现次数小于根号的颜色,这些颜色出现的每个位置最多与其他的根号个位置配对,所以总共只有 \(O(n \sqrt(n))\) 个点,直接二维数点,用分块维护一下,就只有一个根号了