bzoj4025-二分图【线段树分治,并查集】
正题
题目链接: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-二分图【线段树分治,并查集】的更多相关文章
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
- [BZOJ4025]二分图(线段树分治,并查集)
4025: 二分图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2191 Solved: 800[Submit][Status][Discuss] ...
- 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)
传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...
- BZOJ4025 二分图(线段树分治+并查集)
之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的 ...
- 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 ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- BZOJ3237 AHOI2013连通图(线段树分治+并查集)
把查询看做是在一条时间轴上.那么每条边都有几段存在时间.于是线段树分治就好了. 然而在bzoj上t掉了,不知道是常数大了还是写挂了. 以及brk不知道是啥做数组名过不了编译. #include< ...
- BZOJ4025 二分图 线段树分治、带权并查集
传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...
随机推荐
- docker 安装部署 jenkins
cd /data/docker-data/jenkins mkdir jenkins_home chmod 777 jenkins_home docker run -d -p 10240:8080 - ...
- shell 函数返回值与字典
shell的函数只能返回整数值,如果想让函数返回字符串可以在函数调用处为变量赋值. # 定义函数function test() { name=$1 echo "123213" } ...
- SpringBoot的快速入门
快速创建一个SpringBoot项目(两种方式:STS版本,IntelliJ IDEA) 1.STS方式:什么是STS?是Spring团队推荐使用的开发工具 所谓的sts就是eclipse升级版 继承 ...
- 【SpringMVC】域对象共享数据
使用ModelAndView向request域对象共享数据 index.html <a th:href="@{/testModelAndView}">使用ModelAn ...
- clickhouse物化视图
今天来简单介绍一下clickhouse的物化视图 物化视图支持表引擎,数据保存形式由它的表引擎决定,创建物化视图的完整语法如下: create materialized view mv_log eng ...
- reids在linux上的安装《四》
linux 安装redis 完整步骤 红色字体在我的Centos上没有设置,因为我设置了密码 安装: 1.获取redis资源 wget http://download.redis.io/release ...
- win系统打不开CHM文件(例如JDK的API)
打开文件乱码,打开时弹出乱码 前提说明,存放路径不得有中文,文件名也不能有中文 检查下面三个文件: hh.exe文件放置电脑 C:\Windows目录下: hhctrl.ocx ,its ...
- 如何将excel中纵向的转换成横向保证格式不变,
先选定,复制,然后用--编辑---选择性粘贴--转置--确定.试试能不能实现 ,能把文件发过来看一下
- vue-父子组件之传值和单项数据流问题
前言 我们知道 vue 中父子组件的核心概念是单项数据流问题,props 是单项传递的.那究竟什么是单项数据流问题,这篇文章来总结一下关于这个知识点的学习笔记. 正文 1.父组件传值给子组件 < ...
- github搜索技巧小结
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...