2020牛客暑期多校训练营(第八场)A All Star

题目连接

每个球员有一些粉丝,一个粉丝会去看某个球员比赛的条件是

  • 他喜欢这个球员

  • 和他喜欢同一个球员的人喜欢这个球员。

球员与粉丝的关系可以动态改变,问每一次改变之后,最少请多少球员来比赛才可以使得所有粉丝来看比赛。

改变就是对于 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值