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 的最小花费。

posted @ 2022-03-31 10:56  BlankAo  阅读(19)  评论(0编辑  收藏  举报