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。


感觉是套路

不过没关系,就是连连线段树分治


有一些需要注意的细节

  • dfs的时候就算到达了叶节点别忘了删除加入的边

  • 并查集合并需要启发式的,并且需要用异或值来维护路径奇偶性

    然后如果当前加入边,一定要保证\((u,v)\)距离是奇数,所以用异或计算一下合并根节点的距离

  • 注意清空dep这个数组


剩下的就很套路的分解线段,很套路的dfs,很套路的并查集维护就可以了


//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 2e5 + 10;
#define mp make_pair
#define fi first
#define se second
typedef pair<int, int> pi;
typedef pair<pi, pi> pii; #define LD (t << 1)
#define RD (t << 1 | 1)
vector<pi> g[N << 2]; void modify(int t, int l, int r, int ql, int qr, pi edge) {
if (ql <= l && r <= qr) {
g[t].push_back(edge);
return;
}
int mid = (l + r) >> 1;
if (qr <= mid) modify(LD, l, mid, ql, qr, edge);
else if (ql > mid) modify(RD, mid + 1, r, ql, qr, edge);
else {
modify(LD, l, mid, ql, mid, edge);
modify(RD, mid + 1, r, mid + 1, qr, edge);
}
} stack<pair<pii, pi> > st;
int dep[N], height[N], fa[N];
int ans = 1; int Find(int x) {
if (x == fa[x]) return x;
return Find(fa[x]);
} int Getdep(int x) {
if (x == fa[x]) return 0;
return dep[x] ^ Getdep(fa[x]);
} void Merge(int u, int v) {
int fau = Find(u), fav = Find(v);
st.push(mp(mp(mp(fau, fav), mp(height[fau], height[fav])), mp(ans, fau != fav)));
int w = Getdep(u) ^ Getdep(v);
if (fau == fav) {
if (!(w & 1)) ans = 0;
return;
}
if (height[fau] == height[fav]) {
fa[fav] = fau;
dep[fav] = w ^ 1;
++height[fau];
} else if (height[fau] > height[fav]) {
fa[fav] = fau;
dep[fav] = w ^ 1;
} else {
fa[fau] = fav;
dep[fau] = w ^ 1;
}
} void Delete() {
pair<pii, pi> now = st.top(); st.pop();
ans = now.se.fi;
if (!now.se.se) return;
int u = now.fi.fi.fi, heightu = now.fi.se.fi;
int v = now.fi.fi.se, heightv = now.fi.se.se;
if (heightu == heightv) {
fa[v] = v;
dep[v] = 0;
--height[u];
} else if (heightu > heightv) {
fa[v] = v;
dep[v] = 0;
} else {
fa[u] = u;
dep[u] = 0;
}
} void dfs(int t, int l, int r) {
fv(i, g[t]) Merge(g[t][i].fi, g[t][i].se);
if (!ans) {
fu(i, l, r) printf("No\n");
} else {
if (l == r) {
printf("Yes\n");
} else {
int mid = (l + r) >> 1;
dfs(LD, l, mid);
dfs(RD, mid + 1, r);
}
}
fv(i, g[t]) Delete();
} int n, m, T;
int main() {
freopen("input.txt", "r", stdin);
Read(n), Read(m), Read(T);
fu(i, 1, n) fa[i] = i, height[i] = 1, dep[i] = 1;
fu(i, 1, m) {
int u, v, s, t;
Read(u), Read(v), Read(s), Read(t);
if (++s > t) continue;
modify(1, 1, T, s, t, mp(u, v));
}
dfs(1, 1, T);
return 0;
}

BZOJ4025: 二分图【线段树分治】【带撤销的并查集】的更多相关文章

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

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

  2. BZOJ4025 二分图 线段树分治、带权并查集

    传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...

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

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

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

    4025: 二分图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2191  Solved: 800[Submit][Status][Discuss] ...

  5. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  6. 洛谷P3247 [HNOI2016]最小公倍数(分块 带撤销加权并查集)

    题意 题目链接 给出一张带权无向图,每次询问\((u, v)\)之间是否存在一条路径满足\(max(a) = A, max(b) = B\) Sol 这题居然是分块..想不到想不到..做这题的心路历程 ...

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

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

  8. 线段树分治初步学习&洛谷P5227[AHOI2013]连通图

    线段树分治 其实思想说起来是比较简单的,我们把这个题里的所有操作(比如连边删边查询balabala)全部拍到一棵线段树上,然后对着整棵树dfs一下求解答案,顺便把操作做一下,回溯的时候撤销一下即可.虽 ...

  9. BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)

    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 Connec ...

随机推荐

  1. rest-framework框架的基本组件

    快速实例 Quickstart 大致步骤 (1)创建表,数据迁移 (2)创建表序列化类BookSerializer class BookSerializer(serializers.Hyperlink ...

  2. 图:无向图(Graph)基本方法及Dijkstra算法的实现 [Python]

    一般来讲,实现图的过程中需要有两个自定义的类进行支撑:顶点(Vertex)类,和图(Graph)类.按照这一架构,Vertex类至少需要包含名称(或者某个代号.数据)和邻接顶点两个参数,前者作为顶点的 ...

  3. NodeJS学习笔记五

    Promise简介 所谓Promise,就是一个对象,用来传递异步操作的消息. Promise对象有以下两个特点. (1)对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pen ...

  4. Ubuntu软件包管理器

    Ubuntu软件包管理 Ubuntu下对软件管理工具有:apt,dpkg,tasksel,aptitude等,我们常用的就是前三个工具.下面就介绍这三个工具的用法. dpkg 在Linux发展之初,安 ...

  5. SecureCRT 会话空闲时超时退出处理

    参考文章:http://www.cnblogs.com/xuxm2007/archive/2011/04/21/2023611.html http://yunwei.blog.51cto.com/38 ...

  6. 【乱码】运行java -jar xx.jar存到hbase里的数据乱码

    程序在Eclipse里运行没有问题,但是打成jar包之后写入hbase里的数据会有乱码,ES里正常 经过测试,运行命令里加上-Dfile.encoding=utf-8 就可以正常写入,但是cmd命令里 ...

  7. 【转载】Java关键字之"transient"

    原文出处:http://blog.csdn.net/lanxuezaipiao/article/details/16358677 transient的作用及使用方法 我们都知道一个对象只要实现了Ser ...

  8. /msgsrvmgr.cpp:4:26: fatal error: kdl/frames.hpp: No such file or directory #include <kdl/frames.hpp>

    /home/xxx/ros_workspace/src/bp_protocol_bridge/protospot/src/msgsrvmgr.cpp::: fatal error: kdl/frame ...

  9. OpenGL超级宝典笔记——遮挡查询 [转]

    目录[-] 遮挡查询之前 包围体 遮挡查询 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率.遮挡查询就是 ...

  10. Mysql语句转义

    String sqlStr = "SELECT * FROM t_sys_dic WHERE idPath LIKE" + "'" + "/19/20 ...