正题

题目链接:https://darkbzoj.tk/problem/4025


题目大意

\(n\)个点\(m\)条边,每条边会在一个\(T\)以内的时间段内出现,对于任意一个\(T\)以内的时刻求图是否是一个二分图。

\(1\leq n,T\leq 10^5,1\leq m\leq 2\times 10^5\)


解题思路

插边就暴力插到线段树的对应区间位置,然后考虑怎么判二分图。

可以用扩展域并查集,但是因为要撤回所以不能路径压缩,要用按秩合并。

时间复杂度\(O(n\log^2n )\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=2e5+10;
struct node{
int x,y,d;
}cl[N<<5];
int n,m,T,tot,fa[N],dep[N];
vector<pair<int,int> >e[N<<1];
void Change(int x,int L,int R,int l,int r,pair<int,int> edg){
if(L==l&&R==r){e[x].push_back(edg);return;}
int mid=(L+R)>>1;
if(r<=mid)Change(x*2,L,mid,l,r,edg);
else if(l>mid)Change(x*2+1,mid+1,R,l,r,edg);
else Change(x*2,L,mid,l,mid,edg),Change(x*2+1,mid+1,R,mid+1,r,edg);
return;
}
int find(int x)
{return (fa[x]==x)?x:find(fa[x]);}
void coc(int x,int y){
if(x==y)return;
if(dep[x]>dep[y])swap(x,y);
cl[++tot]=(node){x,y,dep[x]};
fa[y]=x;dep[x]=max(dep[x]+1,dep[y]);
return;
}
bool unionm(int x,int y){
int fx=find(x),Fx=find(x+n);
int fy=find(y),Fy=find(y+n);
if(fx==fy)return 1;
coc(fx,Fy);coc(fy,Fx);
return 0;
}
void ClearTo(int bf){
while(tot>bf){
int x=cl[tot].x,y=cl[tot].y,d=cl[tot].d;
fa[y]=y;dep[x]=d;tot--;
}
return;
}
void Solve(int x,int L,int R){
int bf=tot,flag=0;
for(int i=0;i<e[x].size();i++){
flag|=unionm(e[x][i].first,e[x][i].second);
if(flag)break;
}
if(flag){
for(int i=L;i<=R;i++)
printf("No\n");
ClearTo(bf);return;
}
if(L==R){printf("Yes\n");ClearTo(bf);return;}
int mid=(L+R)>>1;
Solve(x*2,L,mid);
Solve(x*2+1,mid+1,R);
ClearTo(bf);return;
}
int main()
{
freopen("4.in","r",stdin);
freopen("1.ans","w",stdout);
scanf("%d%d%d",&n,&m,&T);
for(int i=1;i<=m;i++){
int l,r,u,v;
scanf("%d%d%d%d",&u,&v,&l,&r);
if(l==r)continue;
Change(1,1,T,l+1,r,mp(u,v));
}
for(int i=1;i<=2*n;i++)fa[i]=i;
Solve(1,1,T);
return 0;
}

bzoj4025-二分图【线段树分治,并查集】的更多相关文章

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

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

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

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

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

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

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

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

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

  6. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

  7. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  8. BZOJ3237 AHOI2013连通图(线段树分治+并查集)

    把查询看做是在一条时间轴上.那么每条边都有几段存在时间.于是线段树分治就好了. 然而在bzoj上t掉了,不知道是常数大了还是写挂了. 以及brk不知道是啥做数组名过不了编译. #include< ...

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

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

随机推荐

  1. Socket入门Demo

    一.简单介绍下Socket编程    申明:.net网络编程 1)什么是Socket编程? Socket编程就是常说的网络通讯编程,套接字编程.一般应用于软件聊天通讯,以及软件与硬件之间的通讯. 通熟 ...

  2. WPF教程(四)RelativeSource属性

    我们进行Bingding时,如果明确知道数据源的Name,就能用Source或者ElementName进行绑定,但是有时候我们需要绑定的数据源可能没有明确的Name,此时我们就需要利用Bingding ...

  3. Centos7 安装 redis4.x

    一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@iZwz991stxd ...

  4. 1.3RDD的设计与运行原理

    此文为个人学习笔记如需系统学习请访问http://dblab.xmu.edu.cn/blog/1709-2/ 提供一种通用的数据抽象 RDD典型的执行过程如下: RDD读入外部数据源(或者内存中的集合 ...

  5. 使用Spark开发应用程序,并将作业提交到服务器

    1.pycharm编写spark应用程序 由于一些原因在windows上配置未成功(应该是可以配置成功的).我是在linux上直接使用pycharm,在linux的好处是,环境可能导致的一切问题不复存 ...

  6. 对集合使用Comparator

    1 import java.util.Comparator; 2 import java.util.PriorityQueue; 3 4 /** 5 * 对集合使用Comparator,不改变对象的自 ...

  7. MediaWiki定制化改动

    Linux下面安装MediaWiki环境的方法,可以参照我上一篇文章linux使用xampp安装MediaWiki环境 重置用户密码 使用维护脚本 可以使用maintenance/changePass ...

  8. GUI容器之Frame

    Frame public class MyFrame { public static void main(String[] args) { //创建一个Frame对象 Frame frame = ne ...

  9. linux系统配置本地yum源

    1. 前言 学习Linux系统需要大量的实验,而每次安装系统和准备安装系统后的基础配置比较耗时费力.如果在生产环境中,遇到内网(无法访问互联网)情况下,就需要利用挂载的ISO文件内的Packages中 ...

  10. NOIP模拟21:「Median·Game·Park」

    T1:Median   线性筛+桶+随机化(??什么鬼?).   首先,题解一句话秀到了我: 考虑输入如此诡异,其实可以看作随机数据   随机数据??   这就意味着分布均匀..   又考虑到w< ...