bzoj4025

首先我们要知道,怎么去维护一个是否是二分图

二分图的充要条件:点数>=2且无奇环

重点就是不存在奇环,怎么做呢

考虑随便维护一个图的生成树,不难发现,如果一条边加入后,形成奇环的话就不是二分图

否则的话,我们可以无视这条边,因为如果之后再新加入一条边和这条边形成了一个奇环

那么新加入的边一定和原来生成树上的边也能形成奇环

所以我们直接维护一棵生成树即可

然后裸的想法就来了,直接维护lct即可

然后还是那句话:cdq大法好

我们可以对时间线分治,考虑每条边对应时间段的影响

这样就只有加边而不用删边了,我们可以用并查集维护

与bzoj3237的处理方法有些类似

  1 type node=record
  2        x,y,s,t:longint;
  3      end;
  4
  5 var c,d,fa:array[0..100010] of longint;
  6     e:array[0..200010] of node;
  7     te:array[0..300010*20] of node;
  8     st:array[0..300010*20] of longint;
  9     ans:array[0..100010] of boolean;
 10     en,top,t,n,m,len,i,x,y,a,b:longint;
 11
 12 procedure swap(var a,b:longint);
 13   var c:longint;
 14   begin
 15     c:=a;
 16     a:=b;
 17     b:=c;
 18   end;
 19
 20 function getf(x:longint):longint;
 21   begin
 22     while fa[x]<>x do x:=fa[x];
 23     exit(fa[x]);
 24   end;
 25
 26 function dis(x:longint):longint;
 27   begin
 28     dis:=0;
 29     while fa[x]<>x do
 30     begin
 31       dis:=dis xor c[x];
 32       x:=fa[x];
 33     end;
 34   end;
 35
 36 procedure union(x,y,w:longint);
 37   begin
 38     if d[x]>d[y] then swap(x,y);
 39     fa[x]:=y;
 40     inc(en);
 41     st[en]:=x;
 42     c[x]:=w;
 43     if d[x]=d[y] then
 44     begin
 45       inc(en);
 46       st[en]:=-y;
 47       inc(d[y]);
 48     end;
 49   end;
 50
 51 procedure rebuild(be:longint);
 52   var x:longint;
 53   begin
 54     while be<>en do
 55     begin
 56       x:=st[en];
 57       if x<0 then
 58         dec(d[-x])
 59       else begin
 60         fa[x]:=x;
 61         c[x]:=0;
 62       end;
 63       dec(en);
 64     end;
 65   end;
 66
 67 procedure add(x,y,a,b:longint);
 68   begin
 69     inc(len);
 70     e[len].x:=x;
 71     e[len].y:=y;
 72     e[len].s:=a;
 73     e[len].t:=b;
 74   end;
 75
 76 procedure cdq(m,l,r:longint);
 77   var mid,x,y,w,be,j,dow:longint;
 78   begin
 79     be:=en;
 80     mid:=(l+r) shr 1;
 81     for i:=1 to m do
 82       if (e[i].s=l) and (e[i].t=r) then
 83       begin
 84         x:=getf(e[i].x);
 85         y:=getf(e[i].y);
 86         w:=dis(e[i].x) xor dis(e[i].y) xor 1;
 87         if x<>y then union(x,y,w)
 88         else if w=1 then
 89         begin
 90           for j:=l to r do
 91             ans[j]:=false;
 92           rebuild(be);
 93           exit;
 94         end;
 95       end;
 96     if l=r then ans[l]:=true
 97     else begin
 98       len:=0;
 99       dow:=top;
100       for i:=1 to m do
101       begin
102         if (e[i].s=l) and (e[i].t=r) then continue;
103         inc(top);
104         te[top]:=e[i];
105         if e[i].t<=mid then
106         begin
107           inc(len);
108           e[len]:=e[i];
109         end
110         else if e[i].s<=mid then
111           add(e[i].x,e[i].y,e[i].s,mid);
112       end;
113       cdq(len,l,mid);
114       len:=0;
115       for i:=top downto dow+1 do
116         if te[i].s>mid then
117         begin
118           inc(len);
119           e[len]:=te[i];
120         end
121         else if te[i].t>mid then
122           add(te[i].x,te[i].y,mid+1,te[i].t);
123       top:=dow;
124       cdq(len,mid+1,r);
125     end;
126     rebuild(be);
127   end;
128
129 begin
130   readln(n,m,t);
131   for i:=1 to m do
132   begin
133     readln(x,y,a,b);
134     inc(a);
135     if a>b then continue;
136     add(x,y,a,b);
137   end;
138   for i:=1 to n do
139   begin
140     fa[i]:=i;
141     d[i]:=1;
142   end;
143   cdq(m,1,t);
144   for i:=1 to t do
145     if ans[i] then writeln(‘Yes‘) else writeln(‘No‘);
146 end.

时间: 2024-10-13 03:54:43

bzoj4025的相关文章

BZOJ4025 二分图 分治 并查集 二分图 并查集按秩合并 带权并查集

原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中第$i$条边连接节点$x_i,y_i$,并且在$start_i$时刻出现,在$end_i$时刻消失.问每一个时刻的图是不是二分图. $n\leq 10^5,m\leq 2\times 10^5,T\leq 10^5$ 题解 真是一道好题. 做这题我才发现我从来没写过按秩合并的并查集QAQ. 先考虑按

[BZOJ4025]二分图(线段树分治,并查集)

4025: 二分图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2191  Solved: 800[Submit][Status][Discuss] Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input 输入数据的第一行是三个整数n,m,T. 第2行到第m+1行,每行4个整数u,v,start,end

bzoj4025 二分图

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4025 [题解] 考虑对时间分治,用可撤回的启发式合并并查集来维护连通性. 二分图的条件是没有奇环,用并查集判即可. 对于时间区间[l,r],如果边在这期间都存在,那么就加入并查集,对于剩下的边分类,并且分治下去做. 对于每条边,在log个区间表示出来了,需要进行判断,启发式合并的getf是log的,所以复杂度为O(nlog^2n) # include <stdio.h> # includ

bzoj4025: 二分图(留坑后填)

这题想不出来. 不浪费时间了. 以后找时间填. 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8516221.html

bzoj4025 二分图 [分治,并查集]

传送门 思路 是二分图的充要条件:图没有奇环. 考虑按时间分治,用可撤销并查集维护点到根的距离. 仍然可以用一个小trick把两点连边变成根连边,可以看这里. 每次连边时若不连通则连上,否则判一下有没有奇环.如果有输出"No",否则不用连. 我tm把T写成m狂WA不止 #include<bits/stdc++.h> namespace my_std{ using namespace std; #define pii pair<int,int> #define f

并查集的按秩合并

表示吉利的讲课第一题我就听得一脸懵逼......没救啦 然后请教了一下伊嘉,大概明白了是对时间轴分治然后按秩合并,就回来学了下. POJ2492 传送门:http://poj.org/problem?id=2492 等等,我为什么要写这道题. 这道题,不用按秩也能A啊.... 15444012 wxx_louisa 2492 Accepted 192K 750MS C++ 784B 2016-04-27 19:26:42 15444008 wxx_louisa 2492 Accepted 200

滚粗记之2016军训后学校模拟赛

2016.8.24 maths(40/100): 容斥原理 f(n)与f(n的质因数)是递推关系 //数据中的“质数”特殊点已经给了提示 所以,先预处理即可 mahjong(0/100):暴搜+hash   orzzzzzzz bzoj1860       n<=100,t<=100 所以这题时间复杂度大致为O(n^2*t) [ZJOI2006]     想到dp         //考试时想到了但不知怎么编,还是太弱了QAQ肿么办 然而暴搜QAQ 附上详解:http://blog.csdn.

【冲刺noi】真banzi大集合

自己风格的板子 = = 考试时别把板子码错就好 = = 一.数据结构 1.树状数组单点修改区间查询(luogu3374) #include <cstdio> int f[500010] , n; void add(int x , int a) { int i; for(i = x ; i <= n ; i += i & -i) f[i] += a; } int query(int x) { int i , ans = 0; for(i = x ; i ; i -= i &

【Educational Codeforces Round 22】

又打了一场EDU,感觉这场比23难多了啊-- 艹还是我太弱了. A. 随便贪心一下. #include<bits/stdc++.h> using namespace std; int n,sum=0,ans=-1,m; inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(