正题

题目链接: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. C# 调用DOS 命令

    class NetWorkDeviceInfo { public static string GetDeviceInfo() { System.Diagnostics.Process p = new  ...

  2. 异步编程async体会

    namespace 异步编程{ class Program { static void Main(string[] args) { Console.WriteLine("mian this ...

  3. jQuery中的常用方法:empty()、each()、$.each()、$.trim()、focus()(二)

    <!DOCTYPE html> <html> <head> <title>02_commonMethod.html</title> < ...

  4. 《深入理解java虚拟机》第3版笔记3

    第3章 垃圾收集器与内存分配策略 可达性分析算法 在Java技术体系里面,固定可作为GC Roots的对象包括以下几种: 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使 ...

  5. MySQL-基础-2

    MySQL数据库介绍 • MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. • MySQL的历 ...

  6. git跟踪忽略规则文件.gitignore

    在使用Git的过程中,我们希望有的文件比如临时文件,编译的中间文件等不要被跟踪,也不需要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交. 配置语法 以斜杠"/"开 ...

  7. Golang入门学习(三):函数

    文章目录 2.3 函数 2.3.1 基本语法 2.3.2 入门demo: 2.3.3 函数递归: 2.3.4 函数注意事项 2.3.5 init函数 2.3.6 匿名函数 2.3.7 闭包 2.3.8 ...

  8. centos7关于防火墙的一些操作

    防火墙相关 # 检查防火墙状态 systemctl status firewalld # 开启防火墙 systemctl start firewalld # 关闭防火墙 systemctl stop ...

  9. 硕盟type-c转接头HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞

    硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...

  10. prometheus从零开始

    本次的想法是做服务监控 并告警  主要线路如下图所示 1.运行prometheus  docker方式 docker run -itd \ -p 9090:9090 \ -v /opt/prometh ...