昨天mac的gdb挂了,今天怎么笔记本的gdb也挂了……

Description

神犇有一个n个节点的图。因为神犇是神犇,所以在T时间内一些边会出现后消失。神犇要求出每一时间段内这个图是否是二分图。这么简单的问题神犇当然会做了,于是他想考考你。

Input

输入数据的第一行是三个整数n,m,T。
第2行到第m+1行,每行4个整数u,v,start,end。第i+1行的四个整数表示第i条边连接u,v两个点,这条边在start时刻出现,在第end时刻消失。

Output

输出包含T行。在第i行中,如果第i时间段内这个图是二分图,那么输出“Yes”,否则输出“No”,不含引号。

Sample Input

3 3 3
1 2 0 2
2 3 0 3
1 3 1 2

Sample Output

Yes
No
Yes

HINT

样例说明:
0时刻,出现两条边1-2和2-3。
第1时间段内,这个图是二分图,输出Yes。
1时刻,出现一条边1-3。
第2时间段内,这个图不是二分图,输出No。
2时刻,1-2和1-3两条边消失。
第3时间段内,只有一条边2-3,这个图是二分图,输出Yes。
数据范围:
n<=100000,m<=200000,T<=100000,1<=u,v<=n,0<=start<=end<=T。

题目分析

线段树分治一样的套路

重点在于如何判断一张图是否是二分图。我们知道二分图的充要条件是无奇环的森林:那么奇环的成立条件是在并查集合并时,所连边的两个点在原树中的路径长度为偶数。用$d[x]$表示$x$点在并查集结构中,到其父亲的路径奇偶性;初始每个点独自为根,则$d[x]=0$。每当两个不同的集合合并时,就应该 d[fx]=get(x)^get(y)^ ,相当于是在并查集中维护了原图的结构。

可以用以上这幅图理解。

第一遍写的时候,想当然地混淆了按秩合并并查集和原图这两个树形结构,get的时候直接^1地跳了。

 #include<bits/stdc++.h>
const int maxn = ;
const int maxm = ;
const int maxt = ;
const int maxOpt = ; int n,m,T;
struct Edge
{
int u,v,s,t;
Edge(int a=, int b=, int c=, int d=):u(a),v(b),s(c),t(d) {}
}tmp;
typedef std::vector<Edge> vec;
struct Dsu
{
int top,fat[maxn],size[maxn],d[maxn];
std::pair<int, int> stk[maxOpt];
void init(){for (int i=; i<=n; i++) fat[i] = i, size[i] = ;}
int find(int x){while (x!=fat[x]) x = fat[x];return x;}
int get(int x){int ret = ;while(x!=fat[x]) ret ^= d[x], x = fat[x];return ret;}
bool merge(int x, int y)
{
int fx = find(x), fy = find(y);
if (fx==fy) return get(x)^get(y)^;
if (size[fx] > size[fy]) std::swap(fx, fy);
fat[fx] = fy, size[fy] += size[fx];
d[fx] = get(x)^get(y)^;
stk[++top] = std::make_pair(fx, fy);
return ;
}
void cancel()
{
int x = stk[top].first, y = stk[top].second;
fat[x] = x, size[y] -= size[x], --top, d[x] = ;
}
}dsu;
bool ans[maxt];
vec opt; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
51 void solve(int l, int r, vec opt)
{
vec L,R;
int mid = (l+r)>>, tmp = dsu.top;
for (int i=, mx=opt.size(); i<mx; i++)
{
int s = opt[i].s, t = opt[i].t;
if (s <= l&&r <= t){
if (dsu.merge(opt[i].u, opt[i].v)){
while (tmp!=dsu.top) dsu.cancel();
return;
}
}else{
if (s <= mid) L.push_back(opt[i]);
if (t > mid) R.push_back(opt[i]);
}
}
if (l==r) ans[l] = ;
else solve(l, mid, L), solve(mid+, r, R);
while (tmp!=dsu.top) dsu.cancel();
}
int main()
{
n = read(), m = read(), T = read(), dsu.init();
for (int i=; i<=m; i++)
{
tmp.u = read(), tmp.v = read(), tmp.s = read()+, tmp.t = read();
if (tmp.s <= tmp.t) opt.push_back(tmp);
}
solve(, T, opt);
for (int i=; i<=T; i++) puts(ans[i]?"Yes":"No");
return ;
}

END

【离线 线段树分治】bzoj4025: 二分图的更多相关文章

  1. bzoj4025二分图(线段树分治 并查集)

    /* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...

  2. BZOJ4025 二分图(线段树分治+并查集)

    之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的 ...

  3. 【BZOJ4025】二分图(线段树分治,并查集)

    [BZOJ4025]二分图(线段树分治,并查集) 题面 BZOJ 题解 是一个二分图,等价于不存在奇环. 那么直接线段树分治,用并查集维护到达根节点的距离,只计算就好了. #include<io ...

  4. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  5. 【BZOJ4025】 二分图(线段树分治)

    传送门 BZOJ Solution 只是为了学习一下线段树分治的啦! 当你学会线段树分治之后,可以跳过下面的一部分: 按照时间搞一颗线段树出来,把包含这段区间的操作用vector压进去. 每一个线段树 ...

  6. 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)

    传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...

  7. BZOJ4025: 二分图【线段树分治】【带撤销的并查集】

    Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...

  8. 线段树分治总结(线段树分治,线段树,并查集,树的dfn序,二分图染色)

    闲话 stO猫锟学长,满脑子神仙DS 网上有不少Dalao把线段树分治也归入CDQ分治? 还是听听YCB巨佬的介绍: 狭义:只计算左边对右边的贡献. 广义:只计算外部对内部的贡献. 看来可以理解为广义 ...

  9. [BZOJ 4025]二分图(线段树分治+带边权并查集)

    [BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...

随机推荐

  1. DOM的学习网站 DOM是HTML和XML的编程接口

  2. shell学习(9)- du和df区别及详解

    清明小长假来加班,总得干点啥吧,今天就说说du 和df的区别. 1.区别 du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有删除的.他计算 ...

  3. easyui的datagrid用js插入数据等编辑功能的实现

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. CodeForces - 287B-Pipeline(二分)

    Vova, the Ultimate Thule new shaman, wants to build a pipeline. As there are exactly n houses in Ult ...

  5. bzoj1095: [ZJOI2007]Hide 捉迷藏 动态点分治学习

    好迷啊...感觉动态点分治就是个玄学,蜜汁把树的深度缩到logn (静态)点分治大概是递归的时候分类讨论: 1.答案经过当前点,暴力(雾)算 2.答案不经过当前点,继续递归 由于原树可以长的奇形怪状( ...

  6. Polly+AspectCore实现熔断与降级机制

    Polly+AspectCore实现熔断与降级机制 https://www.cnblogs.com/edisonchou/p/9159644.html 一.熔断.降级与AOP 1.1 啥是熔断? 在广 ...

  7. input文本框默认提示

    今天闲暇时间把自己以前写的一个文本框默认提示函数改成了一个小插件.下面是代码 1.引入jQuery库 <script src="http://code.jquery.com/jquer ...

  8. 使用 swift3.0高仿新浪微博

    项目地址:https://github.com/SummerHH/swift3.0WeBo 使用 swift3.0 高仿微博,目前以实现的功能有,添加访客视图,用户信息授权,首页数据展示(支持正文中连 ...

  9. 实例——省市区三级联动 & 还可以输入字符统计

    1 省市区三级联动 html代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  10. jstl表达式的应用的条件

    在el表达式中,有时我们要写for循环,这时我们要写 <c:forEach items="${list}" var="news" > </c: ...