2024.11.22总结
A:
签到题,根号分治,对于小于 的 预处理后缀和,其他的暴力跳即可。
B:
对于一个区间,我们想让它最大只需要保证选择的区间都包含它即可。
考虑将所有区间下放到线段树上,然后遍历整棵树,遍历到一个节点时对当前节点存的区间做背包,若子树中没有下放区间的节点,用 dp 数组更新 vis 数组,否则遍历子树,离开节点时将对 dp 的更新撤销。
C:
先离线。
你考虑维护一个长得像历史和的 DS,你维护一个指针 扫一遍整个序列,线段树上每个叶子 代表 ,这段子区间的前缀中有多少个含有奇数个不同的数。
对于不同的数我们有经典 trick 你记一个 表示与 且离 最近的数,那你每次要更改的就是 这段区间的奇偶性。
然后你对 这段前缀所有为奇数的点进行一个整体加一,你考虑这个玩意咋维护。
一个比较 navie 的想法是上矩阵,常熟太大,我们有全♂新♂做♂法♂。
考虑维护两棵线段树,然后每次反转奇偶性就是交换对应区间,然后整体加一只对一棵线段树做就行了。
D:
先合并连续段,将值取 max,计合并完的段数量为 ,那么最多能取到的点的个数为 。
一个结论是 内的点任选 个点都是可以取到的,考虑你每次取完点后还要从相邻的点中再消掉一个,而剩余点的数量显然大于选择的点的数量,所以一定有合法方案。
排个序,取前 个点就完了。