【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4025

【题目大意】

  给出一张图,有些边只存在一段时间,问在一个每个时间段,
  这张图是否是二分图

【题解】

  判断是否是二分图只要判断是否存在奇环即可,
  我们对时间进行分治,在操作树上加删边,
  保留涵盖时间区间的有效操作,将剩余操作按时间划分到两端的子树,
  退出子树的时候撤销加边操作。
  对于判断奇环,我们用并查集维护每个点与标兵的相对距离的奇偶性即可,
  由于需要撤销操作,我们放弃对并查集的压缩操作,
  采用按秩合并,保证查询的logn复杂度,同时保存每次合并过程即可。

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=300010;
namespace Union_Find_Set{
int st[N],top,f[N],val[N],d[N];
void Initialize(int n){for(int i=1;i<=n;i++)f[i]=i,val[i]=0,d[i]=1;top=0;}
int sf(int x){return f[x]==x?x:sf(f[x]);}
int ask(int x){
int res=0;
for(;x!=f[x];x=f[x])res^=val[x];
return res;
}
void back(int tag){
for(;top!=tag;top--){
if(st[top]<0)d[-st[top]]--;
else{
f[st[top]]=st[top];
val[st[top]]=0;
}
}
}
void Union(int x,int y,int _val){
if(d[x]>d[y])swap(x,y);
if(d[x]==d[y])d[y]++,st[++top]=-y;
f[x]=y; val[x]=_val; st[++top]=x;
}
}
using namespace Union_Find_Set;
struct data{int x,y,l,r;}E[N];
void dfs(int l,int r,int pos){
int t=top;
for(int i=1;i<=pos;i++){
int x=E[i].x,y=E[i].y;
if(E[i].l<=l&&E[i].r>=r){
int fx=sf(x),fy=sf(y);
int val=ask(x)^ask(y)^1;
if(fx==fy){
if(val){
for(int j=l;j<=r;j++)puts("No");
back(t); return;
}
}Union(fx,fy,val);
swap(E[i--],E[pos--]);
}
}if(l==r){puts("Yes");back(t);return;}
int mid=(l+r)>>1,ppos=pos;
for(int i=1;i<=ppos;i++){
if(E[i].l>mid)swap(E[i--],E[ppos--]);
}dfs(l,mid,ppos);
ppos=pos;
for(int i=1;i<=ppos;i++){
if(E[i].r<=mid)swap(E[i--],E[ppos--]);
}dfs(mid+1,r,ppos);
back(t);
}
int n,m,op,x,y,l,r,T;
int main(){
scanf("%d%d%d",&n,&m,&T);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&x,&y,&l,&r);
E[i]=(data){x,y,++l,r};
}Initialize(n);
for(int i=1;i<=m;i++)if(E[i].l>E[i].r)swap(E[i],E[m--]);
dfs(1,T,m);
return 0;
}

BZOJ 4025 二分图(时间树+并查集)的更多相关文章

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

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

  2. BZOJ 4025: 二分图 [线段树CDQ分治 并查集]

    4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...

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

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

  4. BZOJ 4551 [Tjoi2016&Heoi2016]树 ——并查集

    树剖显然可以做. 然而有一种更神奇的方法,并查集+时光倒流. 每个节点指向它上面最近的标记节点,标记节点指向自己,然后删除标记,就可以用并查集查询了. #include <map> #in ...

  5. BZOJ 1453 (线段树+并查集)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1453 题意:一个 n*n 的矩阵,每个位置有黑/白两种颜色,有 m 次操作,每次可以翻转 ...

  6. BZOJ 4551: [Tjoi2016&Heoi2016]树 并查集(&&图论?)

    反向操作,先把所有的标记都打上(记得统计标记的数目),然后依次撤销,合并到自己的上一个点pre,即fa[u]=getf(pre[u]) #include<cstdio> #include& ...

  7. bzoj 4025 二分图 分治+并查集/LCT

    bzoj 4025 二分图 [题目大意] 有n个点m条边,边会在start时刻出现在end时刻消失,求对于每一段时间,该图是不是一个二分图. 判断二分图的一个简单的方法:是否存在奇环 若存在奇环,就不 ...

  8. BZOJ_4025_二分图_线段树按时间分治+并查集

    BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...

  9. 【CF576E】Painting Edges 线段树按时间分治+并查集

    [CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...

随机推荐

  1. UIActivityIndicatorView---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址: iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 UIActivityIndicatorViewactivityIndicatorVi ...

  2. quick-cocos2dx lua中读取 加密 csv表

    我非常想把一些非必需的信息以CSV表的格式保存到客户端,以减少和服务器的通讯,降低压力.于是写了这么一个. 但因为大家觉得这样的话,需要每次登陆时来检测同步这些数据,会减慢登陆速度,于是没有用到. 我 ...

  3. 大聊Python----协程

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  4. CSS浮动和清除

    float:让元素浮动,取值:left(左浮动).right(右浮动) clear:清除浮动,取值:left(清除左浮动).right(清除右浮动).both(同时清除上面的左浮动和右浮动) 1.CS ...

  5. python基础===多进程

    进程线程的区别在进程,线程,协程的区别 linux或者unix有fork()函数,但是不支持win系统. multiprocessing multiprocessing模块是跨平台版本的多进程模块.支 ...

  6. 2017多校第7场 HDU 6121 Build a tree K叉树,思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:一个n个点的完全k叉树,求每个节点的size的异或和. 解法:容易发现,考虑根的所有孩子, ...

  7. Linux平台用C++实现事件对象,同步线程(转)

    本文属于转载,原文链接如下:http://blog.csdn.net/chexlong/article/details/7080537 与其相关的一组API包括:pthread_mutex_init, ...

  8. (转)函数后面加const--C++ const成员函数

    类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于 ...

  9. MYSQL表中向SET类型的字段插入值时值之间不能有空格

    MYSQL 中有一种数据类型是 SET,首先我们查看一个包含 SET 类型字段的表结构: 接下来我们向表中插入数据: 按照上面的语句插入数据发现报错了,于是去掉了插入值之间的空格,然后插入成功:

  10. Leetcode 之Binary Tree Preorder Traversal(42)

    树的先序遍历.定义一个栈,先压入中间结点并访问,然后依次压入右.左结点并访问. vector<int> preorderTraversal(TreeNode *root) { vector ...