BZOJ3563 : DZY Loves Chinese

想法题,由于K是加密的,但是通过读入我们可以自己数出来这一行有几个数,

所以可以直接反解出之前回答为连通的个数

至于最后一个询问就用并查集暴力回答

 

var
  n,i,m,s,k,j,q : longint;
  u,v,cnt,f : array[0..500000] of longint;
  c : array[1..15] of longint;
  del : array[1..500000] of boolean;
function fa(x : longint) : longint;
begin
  if f[x] = x then exit(x);
  f[x] := fa(f[x]);
  exit(f[x]);
end;
begin
  readln(n,m);
  for i := 1 to m do readln(u[i],v[i]);
  readln(q);
  for i := 1 to q do
  begin
    read(s);
    k := 0;
    while not eoln do
    begin
      inc(k);
      read(c[k]);
    end;
    cnt[i-1] := k xor s;
    readln;
  end;
  for i := 1 to q-1 do
    if cnt[i] = cnt[i-1] then
      writeln('Disconnected')
    else
      writeln('Connected');
  for i := 1 to k do del[c[i] xor cnt[q-1]] := true;
  for i := 1 to n do f[i] := i;
  for i := 1 to m do
    if not del[i] then
      if fa(u[i]) <> fa(v[i]) then
      begin
        f[f[u[i]]] := f[v[i]];
        dec(n);
      end;
  if n > 1 then
    writeln('Disconnected')
  else
    writeln('Connected');
end.

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值