数据结构做题笔记

突然发现数据结构太菜了,这里记录一些数据结构题。

CF1085F Rock-Paper-Scissors Champion

一排的人,玩石头剪刀布,预先设定好手型。

你可以做局,让某相邻两个人比,平局做局一个胜者。

问有多少人可以被你做局成冠军。带修。

以石头为例,一个人可以被做局的充要条件:左右两边如果有布则一定有剪刀。

这个就简单了:找到左右第一个布的位置和第一个剪刀的位置,然后就是区间数点。

鉴定为简单题。

CF837G Functions On The Segments

给你 \(n\) 个分段函数形如两段平台夹一个一次函数,求单点区间函数值的和。

处理分段函数可以考虑做一个数点:对于询问的 \(x\),一个查询的 \((x_1,y_1)\) 恰好在 \(x\le x_1\) 时贡献。

这时问题就变成了:一个分段函数 \((i,x_1,x_2,a,b)\) 和查询 \((x,l,r)\),算一个满足 \(x_1\le x \le x_2\)\(l\le i\le r\) 的贡献 \(ax+b\)

查询显然可以差分成单点,分段函数的贡献显然也可以拆开。

于是问题变成对于 \((i,x_2,a,b)\)\((x,r)\) 算满足 \(x\le x_2\)\(i\le r\)\(ax+b\)

\(i\le r\) 这一维考虑主席树,正好可以维护后缀 \((a,b)\) 的并。

鉴定为简单题。

P4385 [COCI 2009 Final Exam#2] Dvapravca

平面黑白点,找到不存在黑点且所带白点最多的平行线,求白点数量。平行线不经过任何点。

考虑枚举斜率,然后找最大的两条线。

不会……

开了。

woc 竟然是做关于平行线的垂线!!

问题就成功被转换成了最长连续白点段。于是直接维护什么时候两个点的顺序改变即可。\(O(n^2 \log n)\)

CF1684F Diverse Segments

给你一个序列和一些区间,你需要选择最短的子段随意更改使得所有区间内的数都互不相同。

考虑子问题:询问能否不删除任意子段。你考虑每个数和前驱组成一组,如果某个区间包含了一个以上,那它就不合法。

继续这个思路,考虑前驱对。发现复杂度优化不下去。

思路卡住了,从区间本身入手。

包含区间显然可以直接去掉。现在区间双单调了。同时去掉已经满足条件的区间。

注意到一个显然的结论:左端点在第一个区间,右端点在最后一个区间。

那么不交的直接删除即可。

失败了。

从题解区获得了一些新的思路,自己再尝试一下。

我们的目标是找到最佳支配点对。

容易发现一个区间给出了两种限制:一种是必须选的点,一种是二选一的点。

对每种颜色分开考虑。对每个点考虑其作为二选一的点的配套。显然:找到覆盖它的最优右端点的前面即可。

这时同时加入当前点的后继,即可同时完成两种限制。\(O(n\log n)\)

CF700D Huffman Coding on Segment

相当于求区间 WPL。

首先思路就是按照出现次数大小直接合并算贡献。

但这个思路没有一点能扩展到区间的感觉。

考虑莫队。压力马斯内。

出于方便考虑,你可以直接维护关于出现次数的数列。

但其实这题的关键不在于时刻维护区间的答案,而是根据次数信息在询问时获得答案。

考虑根号分治。大数少直接最后跑,小数从下往上合并,多的再给大数一起跑。

复杂度瓶颈在霍夫曼树的构建,\(O(n\sqrt{n\log n})\)

P2664 树上游戏

从每个点出发的所有路径的颜色种类数的和,颜色在点上。

就是直接对颜色建虚树,然后跑树上差分即可。

鉴定为简单题。

CF1316F Battalion Strength

序列的贡献是排序后相邻积的和。单点修改求序列权值期望。

期望是假的。

posted @ 2025-06-27 14:09  一念行空  阅读(19)  评论(0)    收藏  举报