杂题记录

[WC2006]水管局长

题面:

[WC2006]水管局长

题解:

首先根据一些常识,我们可以发现,符合要求的边一定在最小生成树上,因为有删边操作,因此我们需要做的就是动态维护最小生成树。
因为删边不好处理,因此我们可以直接倒着处理,这样删边就变成加边了。
因为要维护边,因此我们考虑将每条边都视作一个带权中转点。即对于x --- > y的边,连x ---> now --- > y,其中now为一个带权点。
同时如果已经构成一棵树,我们要再往里面塞边的话,就必须要删掉一条边,否则会构成环。
因此对于一条连接x ---> y,边权为\(k\)的边,我们查询x -- > y路径上边权的最大值\(maxn\),那么会有2种情况:

  • \(maxn > k\),那么说明插入这条边是优的,因此我们删去最大值所代表的边,加入当前边
  • \(maxn \le k\),那么说明保留最大值比较优,所以我们忽略这条边,不进行修改。

然后就可以了。

[FJOI2015]火星商店问题

题面

[FJOI2015]火星商店问题

题解

观察到,如果没有最近d天的限制,那么我们只需要将所有物品按照所属商店的顺序加入可持久化trie树。
如果我们要查询商店编号在\([ll, rr]\)之间的最大xor值,那么我们只需要查询区间\([l, r]\)内的xor最大值即可。
其中\(l\)表示第一个属于查询范围内的物品编号,\(r\)表示最后一个属于查询范围内的物品编号。
具体如何获取这2个编号?因为物品是按照所属商店顺序加入的,所以我们只需要在加入的物品序列中二分一下就可以了。
那么再考虑最近d天的限制。
相当于是查询商店编号属于\([ll, rr]\),时刻属于\([l, r]\) 内的最大xor值。
我们考虑线段树分治。
对于每个询问区间,我们将它的查询时刻区间分成log段,挂在线段树上。
对于每个物品,因为我们需要将物品按照所属商店的顺序加入,因此对于线段树上的每个区间,我们都需要重建整个可持久化trie树。
不过因为物品是一个单点修改,因此就算我们在每个包括了这个物品的区间都放一个这个物品,每个物品也最多放log个。
因此我们在每个包括了这个物品的区间内放一个这个物品,然后每到一个区间,就取出所有在这个区间内出现过的物品,重建整棵trie树。
然后对于每个挂在这个区间上的询问,二分我们需要查询的物品区间,在可持久化trie树上查询并更新这个询问的答案。
最后再输出即可。
复杂度是\(O(nlog^2n)\)

猜你喜欢

转载自www.cnblogs.com/ww3113306/p/10434283.html