多校第三场 Operating on a Graph

题意
给你n个点,对于点i,其属于i-group。q次操作,对于每一次操作,给出一个值o,如果o-group不存在,则不执行任何操作,否则,则把o-group周围相邻的i-group吞并使其成为o-group。问经过q次操作,每一个点所在的group编号。
思路
对于每一种group可以用并查集维护,并记录一个list,维护group内可扩展的点集。
因为每一个点只多进行一次扩展,所以n个点扩展的复杂度是O(nlogn)+O(n +m)—前者是O(nlogn)(并查集合并),后者是O(n + m)图的遍历
= O n l o g n 复杂度=O(nlogn)

list一些细节(双向链表)
list::size()复杂度为O(n)
list::splice复杂度为O(1)

vector::遍历
for(auto item : G[u]){
//item = G[u][i];
}

AC代码

猜你喜欢

转载自blog.csdn.net/weixin_44412226/article/details/107454349
今日推荐