题目连接
每个球员有一些粉丝,一个粉丝会去看某个球员比赛的条件是
-
他喜欢这个球员
-
和他喜欢同一个球员的人喜欢这个球员。
球员与粉丝的关系可以动态改变,问每一次改变之后,最少请多少球员来比赛才可以使得所有粉丝来看比赛。
改变就是对于 b a 两个数,b 是粉丝编号, a 是球员编号,如果 b 是 a 的粉丝,那么现在b 就不是a 的粉丝了,反之 b 变成了 a 的粉丝。
相当于线段树分治,对于每个询问,丢到线段树的每个叶子节点中,然后记录每个关系持续的区间。使用线段树区间覆盖就可以了。
cnt 代表 联通块的个数, cnta 代表单个球员的个数, cntb 代表单个粉丝的个数,
如果 cntb 不是0, 输出 -1, 否则 输出 cnt - cnta
联通块用 并查集来表示, 每次线段树下推的时候要记录一下当前并查集的状态,返回的时候要记得把数据还原。
这个时候的 并查集不能用路径压缩了,而且并查集合并的时候要启发式合并,就是小的集合连接到大的集合上。
#include<bits/stdc++.h>
using namespace std;
const int N = 4e5+100;
typedef pair<int,int>P;
struct recv{
int a,asz