一种将修改和询问操作转移到线段树上,最后通过遍历线段树求解的离线算法。
初始给定 $n$ 个点,图上没有边。现有 $m$ 条边,每条边出现的时间为 $[l_i,r_i]$。询问每个时刻图是否为二分图。
考虑对时间序列建线段树,然后将每条边插入线段树。
遍历线段树,同时使用拓展域并查集动态维护此时是否为二分图。
如果当前区间已经不是二分图或者遍历到叶子节点即可得到答案并回溯。
由于修改操作需要支持回溯,所有考虑使用按秩合并的可撤销并查集。
修改次数为 $O(m\log n)$,于是总时间复杂度 $O(m\log^2 n)$。
现有 $n$ 个球员,$m$ 个球迷。每个球员有 $k_i$ 个粉丝。
球迷 $i$ 喜欢球员 $j$ 当且仅当以下两个条件至少有一个满足:
接下来 $q$ 次修改操作,每次修改球迷 $x$ 与球员 $y$ 之间粉丝关系。
每次修改后询问至少需要选择多少个球员才能保证每个球迷至少有一个喜欢的球员。如果没有满足条件的方案,输出 $-1$。
把球员和球迷当成点,粉丝关系视为边,于是题目答案等价于连通块个数减去孤立球员个数。
特殊情况为如果存在孤立球迷,此时答案为 $-1$。
考虑对时间序列建线段树,然后可撤销并查集维护连通块个数、孤立球员个数、孤立球迷个数即可。
时间复杂度 $O\left((q+\sum_{i=1}^n k_i)\log q\log n\right)$。
有 $n$ 个商店,编号为 $1\sim n$。每个商店有一个价格为 $v_i$ 的特殊商品。接下来 $m$ 个操作:
记询问时刻为 $t$,该顾客只能在编号为 $[l,r]$ 的商店购物,且只能购买特殊商品或进货时间为 $[t-d+1,t]$ 的商品,问该顾客的最大满意度。
注意初始时刻为 $0$,且询问不会导致时间流逝。
对与区间询问最大异或和操作可以用可持久化字典树 $O(\log v)$ 解决,于是可以先 $O((n+m)\log v)$ 处理出只考虑特殊商品时每个询问的答案。
接下来考虑对时间建立线段树,同时将每个询问加入线段树,遍历线段树时更新答案。
对于修改即进货操作,考虑先对其根据商店编号进行排序,这样就可以使用可持久化字典树加离散化处理询问。
然后遍历线段树时处理完当前节点询问后可以根据修改的时间分配到左右子树处理,每次处理询问重建字典树即可。
时间复杂度 $O((n+m)\log v\log m)$。
给定一个带边权连通图,接下来三种操作:
要求输出初始时所有经过点 $1$ 的回路的边权异或和最大值和每次操作后的最大值。其中边权为二进制数,且长度 $L\le 1000$。
首先建立 $\text{dfs}$ 树,于是题目转化为求所有非树边代表环的边权的集合的子集的异或和最大值。
不难想到线性基加 $\text{bitset}$ 维护。考虑对时间序列建立线段树,操作 $1,2,3$ 不难转化为修改操作加入线段树。
同时考虑保存线段树分治时当前遍历的链上的所有线性基即可完成回溯操作。时间复杂度 $O\left(\cfrac {(m+q)L^2\log q}w\right)$。
同样考虑线性基维护,将所有修改操作按左端点排序,然后按右端点贪心处理。时间复杂度 $O\left(\cfrac {(m+q)L^2}w\right)$。
给定一个双端队列,队列的每个元素有属性 $(w,v)$,队列初始为空。接下来有以下操作:
考虑线段树分治处理,由于 $p$ 较小,于是可以 $\text{dp}$ 暴力转移和回溯。时间复杂度 $O(pq\log q)$。
考虑建立两个栈维护队首修改操作和队尾修改操作。当加入元素时直接暴力背包转移,当删除元素时如果栈为空则均分重构栈。
根据势能分析法,易知重构的均摊时间复杂度为 $O(p)$。
对于查询操作,考虑先假定第一个栈提供特征值为 $0$,单调队列维护第二个栈 $[l,r]$ 范围最大值。
然后第一个栈遍历 $0\sim p-1$,同时单调队列维护第二个栈的区间最大值,单次询问时间复杂度 $O(p)$。
于是总时间复杂度 $O(pq)$。