首页 > 试题广场 >

水灾

[编程题]水灾
  • 热度指数:2 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛牛所在的国家闹水灾了!两个城市之间可能有双向道路,每条道路都有个海拔,牛牛想要知道每次对于某些城市,当水的海拔最低达到多高的时候这些城市两两互不能到达。(如果某条道路的海拔小于等于水的海拔那么这条道路就不能通行)牛牛要问你 q 次,请你帮他解答。

一句话题意:给一个 n 个节点 m 条带权边的无向连通图,有 q 次询问,每次询问图中 ki 个互不相同的点,你可以选择一个数 x,然后将图中所有边权小于等于 x 的边删除。求当删除这些边后 ki 个点互不连通时,x 的最小值。
强制在线

输入描述:
第一行三个整数 n,m,q,表示无向连通图有 n 个节点,m 条边,q 次询问。
接下来 m 行,每行三个整数 u,v,w,表示 u,v 之间有一条边权为 w 的无向边。
接下来 q 行,每行第一个整数为 ki,表示第 i 次询问有 ki 个点。
之后有 ki 个整数 a1',a2',...,aki',真实询问的点 aj 为 aj' 按位异或上 lastans 后的值。
lastans 为上一次询问的答案,初始时 lastans=0。


输出描述:
共 q 行,每行一个整数表示每次询问的答案。
示例1

输入

6 7 2
1 2 1
2 3 2
3 4 4
4 5 3
2 5 7
5 6 5
1 6 6
3 1 3 5
2 4 1

输出

5
3

说明


第一组询问:
lastans=0,k_i=3,a=\{1,3,5\}
显然删去边权小于等于 5 的边即可使点集 a 中的点互不连通。
第二组询问:
lastans=5,k_i=2,a=\{1,4\}
显然删去边权小于等于 3 的边即可使点集 a 中的点互不连通。

备注:


头像 llmxby
发表于 2020-04-25 19:49:03
这题真的是,卡常卡的我怀疑人生,但也因此也优化了一下lca的板子,树剖求lca常数是真小,这波血赚 询问要求的是询问点两两之间不可达的最小水位,相当于选取一个数x,把比x小的边全删了,那么很容易想把这张图转化为一颗最大生成树,如果在最大生成树上不可达了,那么在原图上显然不可达。 在树上的话,如果可以 展开全文
头像 wxyww
发表于 2020-04-25 19:52:19
solution 首先可以发现,这张图其实可以转化为一棵最大生成树。 我们按权值从大到小加入边,如果新加入的边所连接的两点,已经可以通过其他权值更大的边相连,后面的询问中只删除这条边起不到任何作用。 所以我们考虑建出 重构树。 具体建立方法:对于在生成树中的一条边,新建一个节点,并且从向所在的集合 展开全文