APIO 2019
路灯
一条长度为 n 的 n+1 个点的链。在时刻 0 时给你每条边的出现 / 不出现的状态。接下来的 q 个时刻会
- 切换某条边的状态
- 询问到目前为止,(a,b) 连通的时间的总和。
。
摘要:区间问题转化为二维数点。
对于每个点对 (a,b),先转化为边对。设(允许)。我们记录它到结束时的时间总和,设为。
那么对于时刻的一次修改操作,假设修改的边是,相当于左右两边的点的连通性发生了变化。设与连通的极大区间是,那么相当于是的都被加上一个(如果这条边出现)或者减掉(如果这条边消失)。
对于一次查询操作,如果当前是不连通的,那么答案就是。否则答案是。你要把预支的部分减掉。
上述过程实际上就是矩阵加,单点求值。把矩阵加写成 4 个前缀矩阵的形式。可以二维数点。
时间复杂度。
奇怪装置
给出。定义映射。给出个区间,求(即有多少个互不相同的元素)。
。
摘要:解同余方程。
解一个方程,得。因此映射是有周期性的。
如果存在,那么答案就是。否则可以把区间都放到的范围,求区间并即可。
桥梁
给一个 n 个点 m 条边的加权无向图,以及每条边的初始权值. 有 q 个操作:
- 把第条边的边权改为。
- 问从编号为的点出发,经过边权大于等于的边能到达的点的个数。
.
摘要:分块,离线,按权值从大到小排序,可撤消并查集,卡常。
这种数据范围的题,想不到 log 的做法,就考虑分块。将操作序列分块,每个为一块。用并查集回答询问。
对于一个操作序列规模为的问题,我们考虑离线处理。我们将条边和操作序列分别按权值从大到小排序。按权值从大到小考虑每个操作。在操作之前我们先考虑权值大于等于当前权值的边。如果当前这条边在这个操作中始终没有被修改,我们就直接把它加到并查集里。否则我们暂时忽略这条边。然后考虑当前这个操作,如果是修改操作我们也忽略,如果是询问操作,我们就想办法在的时间内回答询问。
回答询问:把操作序列里那些有用的(时间最晚)的修改操作找出来,如果权值比询问大就加到并查集里。然后就可以回答询问了。回答完了撤消这部分的修改即可。时间复杂度。注意这里并查集的复杂度是均摊的(吧)
这样的话,复杂度为。
总的复杂度是。由于同阶,于是当时取得最优复杂度。
修订记录
- 2020年1月14日 创建文章