2018.09.30 bzoj4025: 二分图(线段树分治+并查集)
传送门
线段树分治好题。
这道题实际上有很多不同的做法:
cdq分治。
lct。
…
而我学习了dzyo的线段树分治+并查集写法。
所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的区间分别维护信息。
最后按线段树从上到下再从左到右的遍历方式一起统计答案。
这道题可以按时间建树,每次相当于在一段区间里增加边。
最后统计二分图就行了,这个问题可以用并查集解决。
然而我们回溯上去的时候是需要撤销操作的,因此需要用并查集按秩合并。
代码:
#include<bits/stdc++.h>
#define N 100005
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,m,T,ans[N],fa[N],h[N],col[N];
vector<pair<int,int> >e[N<<2];
struct node{
pair<int,int>x;
bool f;
node(pair<int,int>x_,bool f_):x(x_),f(f_){}
};
vector<node>g[N<<2];
inline void update(int p,int l,int r,int ql,int qr,int u,int v){
if(ql>r||qr<l)return;
if(ql<=l&&r<=qr){e[p].push_back(make_pair(u,v));return;}
int mid=l+r>>1;
if(qr<=mid)update(lc,l,mid,ql,qr,u,v);
else if(ql>mid)update(rc,mid+1,r,ql,qr,u,v);
else update(lc,l,mid,ql,qr,u,v),update(rc,mid+1,r,ql,qr,u,v);
}
inline int findcol(int&p){
int ret=0;
while(p!=fa[p])ret^=col[p],p=fa[p];
return ret;
}
inline void query(int p,int l,int r){
bool f=false;
for(int i=0;i<e[p].size();++i){
int u=e[p][i].first,v=e[p][i].second,a=findcol(u),b=findcol(v);
if(u==v){
if(a==b){
f=true;
for(int i=l;i<=r;++i)ans[i]=0;
break;
}
continue;
}
if(h[u]<h[v])swap(u,v);
fa[v]=u,col[v]=a^b^1;
bool tmp=0;
if(h[u]==h[v])h[u]+=(tmp=1);
g[p].push_back(node(make_pair(u,v),tmp));
}
int mid=l+r>>1;
if(l!=r&&!f)query(lc,l,mid),query(rc,mid+1,r);
for(int i=g[p].size()-1;~i;--i){
int u=g[p][i].x.first,v=g[p][i].x.second;
fa[v]=v,col[v]=0,h[u]-=g[p][i].f;
}
}
int main(){
n=read(),m=read(),T=read();
for(int i=1;i<=n;++i)fa[i]=i,ans[i]=h[i]=1;
for(int i=1;i<=m;++i){
int u=read(),v=read(),l=read()+1,r=read();
if(l>r)continue;
update(1,1,T,l,r,u,v);
}
query(1,1,T);
for(int i=1;i<=T;++i)if(ans[i])puts("Yes");else puts("No");
return 0;
}
2018.09.30 bzoj4025: 二分图(线段树分治+并查集)的更多相关文章
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
- [BZOJ4025]二分图(线段树分治,并查集)
4025: 二分图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2191 Solved: 800[Submit][Status][Discuss] ...
- 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 ...
- BZOJ3237 AHOI2013连通图(线段树分治+并查集)
把查询看做是在一条时间轴上.那么每条边都有几段存在时间.于是线段树分治就好了. 然而在bzoj上t掉了,不知道是常数大了还是写挂了. 以及brk不知道是啥做数组名过不了编译. #include< ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- BZOJ4025 二分图 线段树分治、带权并查集
传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...
- Codeforces 1140F Extending Set of Points (线段树分治+并查集)
这题有以下几个步骤 1.离线处理出每个点的作用范围 2.根据线段树得出作用范围 3.根据分治把每个范围内的点记录和处理 #include<bits/stdc++.h> using name ...
随机推荐
- HTML5 Canvas ( 线性渐变, 升级版的星空 ) fillStyle, createLinearGradient, addColorStop
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- UI5-文档-4.9-Component Configuration
在我们介绍了模型-视图-控制器(MVC)概念的所有三个部分之后,现在我们将讨论SAPUI5的另一个重要的结构方面. 在这一步中,我们将把所有UI资产封装在一个独立于索引的组件中.html文件.组件是S ...
- Python之从头开始建立项目流程
一,需求是在桌面建立一个名字为美妆的项目 1)cd desktop 2)mkdir meizhuang_server 3)安装虚拟环境 要在meizhuang_server文件夹下 pipenv - ...
- DB分布式 跨库分页
DB分布式-两种方式 1. JDBC扩展 sharding-jdbc: 直接封装JDBC,代码迁移成本低,适用于任何连接池及ORM框架,JAR包提供服务,未使用中间层,不用额外部署,DBA无需 ...
- ansible进阶小技巧--tags
用ansible写playbook的朋友可能会发现,当配置工作很多时,如果在中间过程出错了,修改后想重新执行,前面的一大堆步骤让人感觉很烦躁.虽然提供了“retry”文件,但是却只是根据host来判断 ...
- Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用
本文介绍了linux中伪终端的创建,介绍了终端的回显.行缓存.控制字符等特性,并在此基础上解释和模拟了telnet.SSH开启远程会话的过程. 一.轻量级远程登录 之前制作的一块嵌入式板子,安装了嵌入 ...
- jQuery height()、innerHeight()、outerHeight()函数的区别详解
参考来源:http://www.jb51.net/article/84897.htm 代码示例(可复制到编辑器直接打开): <!DOCTYPE html> <html lang=&q ...
- SOA (面向服务的架构)
面向服务的体系结构,是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语 ...
- cmd 获取 拖拽文件名
1. @echo off & setlocal enableDelayedExpansion set a= set /p a=Please drag your txt file for spl ...
- mysql开通tcp远程连接
1.登陆mysql: mysql -u root mysql 2.运行下面命令 UPDATE `mysql`.`user` SET `Host` = '%' WHERE `user`.`Host` = ...