bzoj3237

首先我们可以把没有询问过的边处理掉,重构图

当然这样也不影响复杂度

考虑到每次询问要删除的边很少,我们完全可以整体处理

把询问划分成两个集合,在前半部分询问未出现边我们可以整体处理掉,缩点重编号(询问的边和点都要重编号)

然后通过分治继续对前半部分做

然后回来,后半部分我们也可以同样的处理

这样我们要维护一个关于当前边集的栈即可

  1 type node=record
  2        x,y:longint;
  3      end;
  4 var e:array[0..200010] of node;
  5     te:array[0..4000010] of node;
  6     q:array[0..100010,0..4] of longint;
  7     h,fa:array[0..100010] of longint;
  8     v,ans:array[0..200010] of boolean;
  9     mh:array[0..200010] of longint;
 10     t,tm,th,n,m,k,i,j:longint;
 11
 12 function getf(x:longint):longint;
 13   begin
 14     if fa[x]<>x then fa[x]:=getf(fa[x]);
 15     exit(fa[x]);
 16   end;
 17
 18 procedure lab(n,m,l,r:longint);
 19   var i,j,x,y:longint;
 20   begin
 21     for i:=1 to n do
 22       fa[i]:=i;
 23     for i:=1 to m do
 24       if not v[i] then
 25       begin
 26         x:=getf(e[i].x); y:=getf(e[i].y);
 27         if x<>y then fa[x]:=y;
 28       end;
 29     th:=0;
 30     for i:=1 to n do
 31       if fa[i]=i then
 32       begin
 33         inc(th);
 34         h[i]:=th;
 35       end;
 36     for i:=1 to n do
 37       h[i]:=h[getf(i)];
 38     tm:=0;
 39     for i:=1 to m do
 40       if v[i] then
 41       begin
 42         inc(tm);
 43         mh[i]:=tm;
 44         e[tm].x:=h[e[i].x];
 45         e[tm].y:=h[e[i].y];
 46       end;
 47     for i:=l to r do
 48       for j:=1 to q[i,0] do
 49         q[i,j]:=mh[q[i,j]];
 50   end;
 51
 52 procedure mark(l,r:longint);
 53   var i,j:longint;
 54   begin
 55     for i:=l to r do
 56       for j:=1 to q[i,0] do
 57         v[q[i,j]]:=true;
 58   end;
 59
 60 procedure cdq(n,m,l,r:longint);
 61   var mid,i:longint;
 62   begin
 63     if l=r then
 64     begin
 65       ans[l]:=true;
 66       for i:=1 to q[l,0] do
 67         if e[q[l,i]].x<>e[q[l,i]].y then
 68         begin
 69           ans[l]:=false;
 70           break;
 71         end;
 72       exit;
 73     end;
 74     mid:=(l+r) shr 1;
 75     for i:=1 to m do
 76     begin
 77       inc(t);
 78       te[t]:=e[i];  //te维护边的栈
 79       v[i]:=false;
 80     end;
 81     mark(l,mid);
 82     lab(n,m,l,mid);
 83     cdq(th,tm,l,mid);
 84     for i:=m downto 1 do
 85     begin
 86       e[i]:=te[t];
 87       dec(t);
 88       v[i]:=false;
 89     end;
 90     mark(mid+1,r);
 91     lab(n,m,mid+1,r);
 92     cdq(th,tm,mid+1,r);
 93   end;
 94
 95 begin
 96   readln(n,m);
 97   for i:=1 to m do
 98     readln(e[i].x,e[i].y);
 99   readln(k);
100   for i:=1 to k do
101   begin
102     read(q[i,0]);
103     for j:=1 to q[i,0] do
104       read(q[i,j]);
105     readln;
106   end;
107   mark(1,k);
108   lab(n,m,1,k);
109   cdq(th,tm,1,k);
110   for i:=1 to k do
111     if ans[i] then writeln(‘Connected‘)
112     else writeln(‘Disconnected‘);
113 end.

时间: 2024-11-04 16:38:07

bzoj3237的相关文章

【bzoj3237】 Ahoi2013—连通图

http://www.lydsy.com/JudgeOnline/problem.php?id=3237 (题目链接) 题意 给出一个无向图,$Q$组询问,每次询问将原图断掉$C$条边后是否还连通. Solution CDQ图分治,并查集维护.实在写不动题了,我能说我是蒯的吗T_T:http://blog.csdn.net/creationaugust/article/details/50889351 细节 bzoj的G++版本是多久以前的了,莫名CE.. 代码 // bzoj3237 #inc

[BZOJ3237][AHOI2013]连通图(分治并查集)

3237: [Ahoi2013]连通图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1736  Solved: 655[Submit][Status][Discuss] Description Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connected Disconnected Connected HINT N<=1000

随机算法瞎练BZOJ3237&amp;3563&amp;3569三倍经验题

随机方法真的好骚啊O(∩_∩)O~ 最早的时候miaom提出一个奇怪的东西: 判断一个数列中是否有0/1/2个数出现奇数次 对每个数赋一个随机权值,异或乱搞,对于判2的情况用一个(可能类似线性基的)方法做一下 然后我就开始瞎bb:能不能在边或点上赋一些随机权,做一些图论的判定性问题 (*^▽^*)判断无向图联通 首先考虑建一棵生成树,则任何破坏连通性的操作都需要破坏这棵树上的边 要使图不联通,肯定有一棵子树掉下来了 而子树掉下来的条件是它的根到根的父亲的边断开,且连接子树和树外点的非树边断开 这

bzoj3237 [Ahoi2013]连通图

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3237 [题解] 先写了一个对询问分治然后不断加边的分治. 发现有可能一条边在几乎每个分治区间都会判,就gg了. 然后get一个比较正常的idea,就是我计算总删边次数cnt,先把没删的添加到边集中. 在分治[l,r]的时候,考虑[l,mid]对[mid+1,r]的影响,把[l,mid]删过的边先在cnt里扣去. 每当一个数被扣到0,也就是意思是在[mid+1,r]没被删了,就加到边集中,递

JS省队集训记

不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么心态? T2 唉,感觉好像做过类似的? T3 唉,怎么是提交答案题…… 感觉前两题都会,信心大增,于是决定先码T2 码了一会,过了第二个样列,还有一个样例?咦怎么过不去? 纠结了一会发现——读错题了,啪啪啪,全写错了……立马就凌乱了 赶快做T1,结果发现meet in middle的空间复杂度好像炸

bzoj4025

首先我们要知道,怎么去维护一个是否是二分图 二分图的充要条件:点数>=2且无奇环 重点就是不存在奇环,怎么做呢 考虑随便维护一个图的生成树,不难发现,如果一条边加入后,形成奇环的话就不是二分图 否则的话,我们可以无视这条边,因为如果之后再新加入一条边和这条边形成了一个奇环 那么新加入的边一定和原来生成树上的边也能形成奇环 所以我们直接维护一棵生成树即可 然后裸的想法就来了,直接维护lct即可 然后还是那句话:cdq大法好 我们可以对时间线分治,考虑每条边对应时间段的影响 这样就只有加边而不用删边

[BZOJ3569]DZY Loves Chinese II(随机化+线性基)

3569: DZY Loves Chinese II Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1515  Solved: 569[Submit][Status][Discuss] Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上有N座祭坛,又有M条膴蠁边. 时而Dzy狂WA而怒发冲冠,神力外溢,