正题

题目链接: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. Kafka 与 RabbitMQ 如何选择使用哪个?

    目录 前言 如何选择? 开发语言 延迟队列 消息顺序性 优先级队列 消息留存 消息过滤 可伸缩行 小结 推荐阅读 前言 我们在工作中经常会用到异步消息,主要使用两种消息模式: 消息队列 发布/订阅 消 ...

  2. zoolkeeper 的Curator的分布式锁

    RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3) CuratorFramework client = CuratorFram ...

  3. windows通过pfx文件生成key、crt文件

    nginx代理的时候,需要填写证书的crt跟rsa文件路径,通过iis导出的证书是pfx文件(不知道nginx能不能直接用pfx文件,没有查看过相关资料),所以要通过pfx文件生成crt.rsa文件. ...

  4. Html 之自动高度 auto 和 100%高度

    HTML 高度 下面示例 设置为 Auto 和 100% <!DOCTYPE html> <html lang="en"> <head> < ...

  5. 多线程Synchronized的两种锁

    Synchronized的作用: 能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果 Synchronized的两个用法: 1)对象锁 包括方法锁(默认锁对象为this当前实例对 ...

  6. linux centos7 定时执行服务监控脚本

    2021-08-25 1. 需求 在服务挂掉之后我们要怎么做才能保证服务在短时间内开启?可以编写脚本监控服务的状态,在服务挂掉后及时将其开启,并定时执行该脚本. 2. 脚本编写 思路:平常我们可以通过 ...

  7. Linux centos7 nginx 的安装

    2021-08-18 1. 环境 # 操作系统[root@test007 /]# uname -aLinux test007 3.10.0-862.el7.x86_64 #1 SMP Fri Apr ...

  8. 一键备份公众号的所有文章到PDF,再也不用担心想看的文章被删了

    有的时候,我们会发现收藏的某个微信公众号文章会被删或者和谐了,尤其是对自己非常实用的文章,一定会后悔当初怎么没有复制或者备份下来. 单篇的公众号文章要备份,随便百度一下就能找到非常多方法,这里就不多废 ...

  9. Django——session保持登录

    Django操作session语法: # 1.设置Sessions值 request.session['session_name'] ="admin" # 2.获取Sessions ...

  10. Docker下制作一个容器镜像

    操作过程描述: (1)先基于centos的镜像启动一个centos容器 (2)在这个容器中安装nginx (3)然后把这个已经安装了nginx的容器制作成一个docker的镜像 操作:docker c ...