Data Rush EZ ver.
别看了,都是一些水题……
https://www.luogu.com.cn/training/1574#problems
CF803G - Periodic RMQ Problem
https://www.luogu.com.cn/problem/CF803G
如果数列一开始是全零,那么动态开点就好了。
所以用 st 表维护一下初始数列即可。
P6018 - [Ynoi2010] Fusion tree
https://www.luogu.com.cn/problem/P6018
从低位到高位插入 Trie。这样全局 +1 就相当于一个点左右儿子翻转,然后递归反转后的 0 子树。
pushup 的时候如何更新子树异或和?维护一条边对应多少个数字即可。
CF817F - MEX Queries
https://www.luogu.com.cn/problem/CF817F
线段树维护区间信息即可,即三个 tag:set,reset,rev
CF797D - Broken BST
https://www.luogu.com.cn/problem/CF797D
拍扁成 dfs 序。如果走到左边,那么右边小于它的都找不到了。右边同理。
更好的做法:
求出每个点可以被扫描到的范围 \([l,r]\)。看他是不是在范围里面。
\([l,r]_{lson}=[l,\min(r,a_u)],[l,r]_{rson}=[\max(l,a_u,r)]\)/
CF1093G - Multidimensional Queries
https://www.luogu.com.cn/problem/CF1093G
原题都不会做了😅
注意到 \(dis(i,j)=\sum\limits_d|a_{d,i}-a_{d,j}|\),所以维护 32 棵线段树 \(T_S\),\(S\) 代表哪些取正,哪些取负。答案就是 \(\max(T_S+T_{32\ xor\ S})\)。
CF500E - New Year Domino
https://www.luogu.com.cn/problem/CF500E
维护 \(wl_i\) 代表推倒 \(i\) 最多可以推到多右边的点,这个可以二分。
再维护 \(val_i\) 代表如果从 \(i\) 开始推,想推到 \(wl_i+1\) 所需代价,这个维护 \(\max(a_i+i)\) 即可。
CF853C - Boredom
https://www.luogu.com.cn/problem/CF853C
即求 \(B\) 的左下角的右上方有多少个黑点,右上角的左下方有多少个黑点,相乘再随便容斥一下就好了(吧?
树套树维护。
CF665E - Beautiful Subarrays
https://www.luogu.com.cn/problem/CF665E
转化为 \(s_r\) xor \(s_{l-1}\ge K\)。
扫描线 + 在 Trie 上 dfs。
CF827C - DNA Evolution
https://www.luogu.com.cn/problem/CF827C
被简单题 👊 了。
\(a_{x,i,j,ch}\) 为第 \(x\) 位是否是 \(\% i=j\) ,而且字符为 ch。
那么单点修改很好处理,查询就是树状数组维护。
CF538F - A Heap of Heaps
https://www.luogu.com.cn/problem/CF538F
考虑一个暴力的做法:我们可以知道 \(i\) 点在 \(k\) 叉树的儿子是一个连续区间 \([l_i,r_i]\),那么我们暴力查 \([l_i,r_i]\) 有多少个大于 \(a_i\) 的数字就好了。用主席树实现。
为什么是对的?假设在求 \(k\) 叉树答案时,询问了 \(x\) 次,那么至少有 \(kx\) 个叶子。所以整个树时 \(O(kx)\) 级别的,所以 \(x\) 时 \(O(n/k)\) 级别的。所以是调和级数,总共查询了 \(n\log n\) 次。
最后时间复杂度为 \(O(n\log^2n)\)。
CF85D - Sum of Medians
https://www.luogu.com.cn/problem/CF85D
线段树 \(s_i\) 代表 \(\bmod 5=i\) 的值。
那么右儿子 pushup 给父亲就是:\(s'_i\to s_{(i+左儿子点数)\bmod 5}\)
CF875D - High Cry
https://www.luogu.com.cn/problem/CF875D
极值分治。
考虑 「或」 具有单调性(如果 \(S\) 是 \(T\) 的子集,那么 \(or\ T\ge or\ S\))。
那么极值分治,设分治到 \([l,r]\) 时最大值位置为 \(k\),那么枚举 \([l,k],[k,r]\) 中较小的那一边,二分右端点。
分治 + 二分 = \(O(n\log^2 n)\).
CF1175E - Minimal Segment Cover
线段按照左端点排序。
设 \(b_i\) 为选择一个 \(1\sim i\) 的线段,可以摸到的最大右端点是什么。这个就相当于 \(\max(r_i)\)。
然后处理询问就时不断地跳 \(b_i\) 直到 \(b_i\ge r\)。倍增加速即可。
CF522D - Closest Equals
https://www.luogu.com.cn/problem/CF522D
莫队,但是 \(n\sqrt n\)。想一下 poLyLog 做法。
对于每个点求出 \(L_i\) 代表左边的最近的 \(i\),那就是求 \(L_i\ge l,i\le r\) 的 \(i-L_i\) 最小值 ,二维数点 \(O(n\log ^2)\)。
CF474E - Pillars
https://www.luogu.com.cn/problem/CF474E
类似 LIS,求出一个点可以被 \([l_i,r_i]\) 的点转移而来,用线段树维护。
CF689D - Friends and Subsequences
https://www.luogu.com.cn/problem/CF689D
极值分治。
CF833B - The Bakery
https://www.luogu.com.cn/problem/CF833B
待填
CF587C - Duff in the Army
https://www.luogu.com.cn/problem/CF587C
树上第 \(k\) 小,用俊摊线段树即可。
CF474F - Ant colony
https://www.luogu.com.cn/problem/CF474F
回滚莫队。
CF838B - Diverging Directions
https://www.luogu.com.cn/problem/CF838B
审错题了,生成树是从父亲走向儿子。
那么肯定是从 \(u\) 走到子树一个点,跳到 1,然后再走到 \(v\)。
随便维护一下 \(u\) 到子树再到 1 的最小花费。