Ynoi 做题记录
原来我逻辑也这么差!!!数据结构能说什么呢。。细节自己多想想。
Ynoi2011−竞赛实验班/loj517−计算几何瞎暴力
不真的全局异或,而是:
- 加入新值,异或上当前 xor 和,丢到等待队列里;
- 排序时把等待队列的值都插到 Trie 里;
- 异或就异或到当前 xor 和上;
- 查询如果涉及到一部分有序一部分无序,就是全局和;否则如果全有序,Trie 上考虑「上次全有序时的 xor 和」下的前 k 项,差分。
维护每个子树各位出现次数和。
坑点:查询,在 Trie 上走的时候按「上次全有序时的 xor 和」,但查子树各位的时候按「当前 xor 和」来。
其实如果你考虑清楚了,这题一点都不坑,甚至还比较小清新。
五彩斑斓的世界
离线询问,对每个块单独做。这样空间就不会炸。
对下标开并查集,权值相同的并一块儿;开一个数组记录每种权值的根的位置。
散块,不支持全局打标记,就暴力改,并趁机重构,清空 tag。
整块:
- maxn≤2x:暴力改所有 >x 的,用 O(α∗(maxn−x)) 的代价让最大值减少了 maxn−x
- maxn>2x:可以看作整体减少 x 再给 ≤0 的加上 x,用 O(α∗x) 的代价让最大值减少了 x
值域与 n 同阶,单块的复杂度是 O(n) 的,总体 O(n√n∗α)。
镜中的昆虫
区间数颜色的标准套路:prei 表示 i 前一个和 i 颜色相同的位置,那么询问 [L,R] 就是在统计 prei<L 的个数。静态就是二维数点。
单点修改怎么做?pre 总修改次数只有 O(n+m),是个带修改二维数点问题。树状数组套线段树可以做,空间也不是很紧。 仅能过 loj 的数据!!ಥ_ಥ
如果加一维时间,看作在每个时间点做完左边的所有修改后查询,就可以 cdq 分治了,每次统计 [l,mid] 的修改对 (mid,r] 的询问的贡献。
区间修改呢?把相同颜色看成一块,考虑均摊分析,如果修改区间不相交显然 pre 的总修改次数是 O(n),如果相交也只会改端点 O(1),总的是 O(n+2m)
为了计算出所有实际的修改,需要开一个 set 维护所有块、颜色数个 set 维护该颜色的块, O((n+2m)logn)
cdq 的不想写了。。下次一定
未来日记
因为这是 Ynoi,值域 1e5 必有其用意。
二分啊主席树的没法和分块有机结合。所以要序列分块套值域分块(
cnt1i,j 表示序列前 i 块在值域第 j 块里出现的次数,cnt2i,j 表示序列前 i 块第 j 个数出现的次数。查询 kth 就先扫值域块确定块,再挨个儿扫过去。
修改呢?散块暴力。整块怎么做?
注意到修改不会增加每块内的颜色种类。这超有用。
块内 x、y 同时有的就暴力改,颜色种类减少 O(n) 次,总复杂度 O(n√n);否则并查集即可。
这题唯一打标记的就是整块的并查集,而只要在散块重构的时候下推就好了。所以还比较清真?我是超级受不了巨大多 tag 的题 /kk
为了方便在下推的时候快速得到所有的真实颜色,还要记录每个根对应的真实颜色是什么。
idx,c 表示块 x 内颜色 c 的根,ridx,d 表示块 x 内根 d 对应的颜色,posi 记录第 i 个位置上的颜色对应的根。把颜色 y 的根指向颜色 x 的根,并清空颜色 x 的根即可。本质是个离散化。