数据结构
Data Structures.
[NOI2021] 密码箱
根据题意容易得出,
下文为了方便,令
由于
于是有
即
可以证明,
这一递推过程可以通过矩阵乘法实现。
$$
\cdot
$$
再分析两种操作。
W
操作相当于添加矩阵
$$
\cdot
$$
接下来考虑 E
操作。
若末尾两数为
带入计算可以发现,两种方式所得结果完全相同。
于是该操作相当于添加矩阵
$$
\cdot
\cdot
$$
修改操作形如添加操作、区间 FILIP
和区间 REVERSE
。平衡树维护四种状态下的乘积即可。
注意矩阵乘法运算顺序。
[JOISC2020] 星座 3
比较直接的做法是笛卡尔树套线段树合并。但还有更简单的做法。
尝试贪心。先按行从小到大扫描。下文中的冲突均指与下方星星的冲突。
假设已经得出了前
显然有两种决策。
- 不选。产生
代价。 - 选。此时所有已经选了但是会产生冲突的星星不能选,产生若干代价。
考虑如何维护冲突。
对于星星
会被
对于冲突点点权和,需要支持区间加、单点查询,可以使用树状数组维护。
还有这应该不是反悔贪心……树状数组修改时减去一个值表示冲突点不再被选中,不是所谓的反悔。
[CQOI2015]任务查询系统
离线怎么做?离线是不是,按查询点排序,加点,加点,加点。然后线段树查询。
更具体地,权值线段树维护每个权值有几个、区间权值之和。把修改差分一下,线段树上二分顺便求和即可。
在线做法直接换主席树就行了。
CF1767F Two Subtrees
先把树拍到 dfs 序上,然后相当于求两个区间加起来的众数。
区间众数经典做法:值域分块,莫队。
这一题相当于两个莫队,四个指针。
复杂度可能高于普通莫队。不会证。
[HNOI2016]序列
套路地算贡献。
设区间
接下来尝试确定
记
那么对于区间
于是右半部分的贡献即为
左半部分同理。
[NOIP2022] 比赛
这不比棋局好写多了?
考虑离线,扫描线维护右端点为
尝试计算以
- 对于
, 序列在 上的最小值为 。 - 对于
, 序列在 上的最小值为 。 - 其余部分最小值不变。
考虑使用线段树维护
记
需要维护
。 及其历史版本和 。
维护以下懒标记:
- 区间赋值标记。
。
注意细节。
[省选联考 2021 A/B 卷] 宝石
从下往上跳很好处理,每次跳到最近的下一个位置。这个过程可以倍增优化。
考虑将询问离线。在线地跳完
自上而下 dfs,对于每个点
- 对于所有加入标记
,将 放入容器 。 - 将容器
内的元素放入下一个容器。 - 对于所有终止标记
,查询 所在容器。 - 退出时撤回所有操作。
可以使用可撤销并查集维护。
- Post title:数据结构
- Post author:Cxny
- Create time:2022-12-09 18:43:30
- Post link:https://cxny.github.io/2022/12/09/ds/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.