JZOJ4769 【GDOI2017模拟9.9】graph CDQ分治+用按秩合并维护带撤销的并查集(BZOJ 4025)
来源:互联网 发布:剑灵捏脸数据百度云 编辑:程序博客网 时间:2024/04/30 13:17
题目大意
现在有
1.
2.
对于每次操作,如果当前是一幅二分图则输出
解题思路
我们先考虑没有删除的情况,判断当前的图是不是一个二分图就相当与判断图中有没有奇环。这个可以用并查集集很轻松的维护(直接记录一下当前点与他祖先是否在二分图的一边,每次找父亲的时候更新一下)。
现在增加了删除操作,我们发现在线很难维护(好像用LCT可以做),那么我们就想想离线的做法。我们可以把第
由于如果并查集加了路径压缩优化后就会丢失中间的信息,所以我们考虑只用按秩合并在
程序
#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 3e5 + 5;struct Node { int u, v, l, r; Node (int a, int b, int c, int d) {u = a, v = b, l = c, r = d;} Node () {}} D[MAXN];int N, M, tot, Ans[MAXN], Save[MAXN], Cnt, Fa[MAXN], Val[MAXN], Deep[MAXN];int Get(int u) {return (Fa[u] == u) ? u : Get(Fa[u]);}int GetVal(int u) { int Ans = 0; for (; u != Fa[u]; u = Fa[u]) Ans ^= Val[u]; return Ans;}void Back(int tag) { for (; Cnt != tag; Cnt --) { if (Save[Cnt] < 0) Deep[-Save[Cnt]] --; else { Fa[Save[Cnt]] = Save[Cnt]; Val[Save[Cnt]] = 0; } }}void Push(int u, int v, int val) { if (Deep[u] > Deep[v]) swap(u, v); if (Deep[u] == Deep[v]) { Deep[v] ++; Save[++ Cnt] = -v; } Fa[u] = v, Val[u] = val; Save[++ Cnt] = u;}void Solve(int L, int R, int Num) { int tag = Cnt; for (int i = 1; i <= Num; i ++) { int u = D[i].u, v = D[i].v; if (D[i].l <= L && D[i].r >= R) { int fu = Get(u), fv = Get(v); int Val = GetVal(u) ^ GetVal(v) ^ 1; if (fu == fv) { if (Val) { for (int j = L; j <= R; j ++) printf("NO\n"); Back(tag); return; } } Push(fu, fv, Val); swap(D[i --], D[Num --]); } } if (L == R) { printf("YES\n"); Back(tag); return; } int Mid = (L + R) >> 1, Lim = Num; for (int i = 1; i <= Lim; i ++) if (D[i].l > Mid) swap(D[i --], D[Lim --]); Solve(L, Mid, Lim); Lim = Num; for (int i = 1; i <= Lim; i ++) if (D[i].r <= Mid) swap(D[i --], D[Lim --]); Solve(Mid + 1, R, Lim); Back(tag);}int main() { scanf("%d%d", &N, &M); for (int i = 1; i <= M; i ++) { int Ord; scanf("%d", &Ord); if (Ord == 1) { int u, v; scanf("%d %d\n", &u, &v); u ++, v ++; D[++ tot] = Node(u, v, i, N); } else { int id; scanf("%d\n", &id); D[++ id].r = i - 1; } } for (int i = 1; i <= N; i ++) Fa[i] = i; Solve(1, M, tot);}
1 0
- JZOJ4769 【GDOI2017模拟9.9】graph CDQ分治+用按秩合并维护带撤销的并查集(BZOJ 4025)
- BZOJ 3237 浅谈CDQ分治+带撤销并查集
- bzoj 4025: 二分图(可撤销并查集+CDQ分治)
- BZOJ 4025|二分图|CDQ分治|并查集|LCT
- [CDQ分治 并查集 || LCT] BZOJ 4025 二分图
- bzoj 4025: 二分图 cdq分治+并查集
- 【hdu】5354 Bipartite Graph【cdq分治+并查集】
- bzoj 2049: [Sdoi2008]Cave 洞穴勘测 (时间分治+带撤销并查集)
- BZOJ 3237 连通图 (cdq分治 并查集)
- [ CDQ分治 并查集 ][ AHOI2013 ] BZOJ3237
- 分治时间+可撤销并查集
- [CDQ分治 并查集 || 随机化权值Xor] BZOJ 3237 [Ahoi2013]连通图
- [CDQ分治 并查集] BZOJ 1453 [Wc]Dface双面棋盘
- BZOJ-2049 2049: [Sdoi2008]Cave 洞穴勘测 LCT||并查集||可撤销并查集+时间分治
- 【bzoj 2102】 [HNOI2005]狡猾的商人 带权并查集维护区间和
- 【XSY2469】graph 分治 并查集
- HDU 5354 Bipartite Graph[cdq+并查集]
- BZOJ 4025: 二分图 并查集判二分图 CDQ分治
- 2009 3
- 深入理解Java微服务架构Dubbo系列—— 第一回 结缘
- Ajax提交数据给后台
- 算法导论(2)
- 刷刷笔试题--[位运算编程题]
- JZOJ4769 【GDOI2017模拟9.9】graph CDQ分治+用按秩合并维护带撤销的并查集(BZOJ 4025)
- 电路与Multisim基础 电流源示例
- Direct3D顶点坐标变换
- Java的集合框架
- TCP、UDP、IP 协议分析
- Java-NowCoder-字符串分隔
- 电路与Multisim基础 电容遇到交流+直流电路时,容抗与隔直通交的特性
- 只要四步即可将win10本本变成无线热点
- 行人检测论文 Integral Channel Features(上)