bzoj 3563 ╮(╯▽╰)╭+ 并查集

25 篇文章 0 订阅
15 篇文章 0 订阅

题意:N个点,M条无向边,Q个操作,每个操作中破坏K条边,其中编号和K已经加密,即原数异或之前未联通的个数(给的是原k,但后面有异或后的k的个数个编号),判断每个操作后是否联通

会做题不等于会出题系列..... ╮(╯▽╰)╭

虽然k已经加密,但是由于k后面跟着k个编号,我们依旧能知道加密后的k ╮(╯▽╰)╭

由于一个数异或两次相当于没有异或,所以我们很容易就得到了之前未联通的个数 ╮(╯▽╰)╭

令 c[i]=segma(1~i-1未联通的个数和)

当 c[i] != c[i-1] 时,第(i-1)个操作是联通的,否则是不连通的

于是我们就判断出了1~q-1 操作后的连通性  ╮(╯▽╰)╭

对于第q个操作,暴力并查集维护即可 ╮(╯▽╰)╭

var
        n,m,t,tx,ty,q,k,p:longint;
        i                :longint;
        c,cnt            :array[0..50010] of longint;
        f                :array[0..100010] of longint;
        flag             :array[0..500010] of boolean;
        x,y              :array[0..500010] of longint;
function get_father(x:longint):longint;
begin
   if x=f[x] then exit(x);
   f[x]:=get_father(f[x]);
   exit(f[x]);
end;

begin
   read(n,m);
   for i:=1 to n do f[i]:=i;
   for i:=1 to m do read(x[i],y[i]);
   read(q);
   for i:=1 to q do
   begin
      read(k);
      t:=0;
      while not eoln do
      begin
         read(p);
         inc(t);
         cnt[t]:=p;
      end;
      c[i]:=t xor k;
   end;
   //
   for i:=2 to q do
     if (c[i]=c[i-1]) then writeln('Disconnected') else writeln('Connected');
   //
   for i:=1 to t do flag[cnt[i] xor c[q]]:=true;
   t:=0;
   for i:=1 to m do
     if not flag[i] then
     begin
        tx:=get_father(x[i]);
        ty:=get_father(y[i]);
        if (tx<>ty) then
        begin
           f[ty]:=tx;
           inc(t);
           if t=n-1 then
           begin
              writeln('Connected');exit;
           end;
        end;
     end;
   writeln('Disconnected');
end.
——by Eirlys




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值