BZOJ4025 二分图 线段树分治、带权并查集
如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集)
但是每条边有消失时间。这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上。
然后遍历整棵线段树,每遍历到一个点将覆盖这个点对应区间的边全部加入带权并查集中,递归到叶子节点输出答案。回溯的时候把在这一个点加入的边从并查集中栈序撤销。
因为需要撤销所以并查集不能使用路径压缩,只能按秩合并。
#include<iostream>
#include<cstdio>
#include<stack>
#include<vector>
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
}
const int MAXN = 1e5 + 7;
int N , M , T;
#define PII pair < int , int >
#define st first
#define nd second
#define mid ((l + r) >> 1)
#define lch (x << 1)
#define rch (x << 1 | 1)
vector < PII > Edge[MAXN << 2];
void addEd(int x , int l , int r , int L , int R , PII Ed){
if(l >= L && r <= R){
Edge[x].push_back(Ed);
return;
}
if(mid >= L) addEd(lch , l , mid , L , R , Ed);
if(mid < R) addEd(rch , mid + 1 , r , L , R , Ed);
}
struct node{
int fa , val , sz;
}dsu[MAXN];
PII find(int x){
if(dsu[x].fa == x) return PII(x , 0);
PII t = find(dsu[x].fa);
return PII(t.st , t.nd ^ dsu[x].val);
}
void solve(int x , int l , int r , bool f){
stack < int > stk;
for(vector < PII > :: iterator t = Edge[x].begin() ; t != Edge[x].end() ; ++t){
int p = (*t).st , q = (*t).nd;
PII M = find(p) , N = find(q);
int m = M.st , n = N.st;
if(m != n){
if(dsu[m].sz > dsu[n].sz)
swap(n , m);
dsu[n].sz += dsu[m].sz;
dsu[m].fa = n;
dsu[m].val = M.nd ^ N.nd ^ 1;
stk.push(m);
}
else
f &= (M.nd ^ N.nd);
}
if(l == r)
puts(f ? "Yes" : "No");
else{
solve(lch , l , mid , f);
solve(rch , mid + 1 , r , f);
}
while(!stk.empty()){
int t = stk.top(); stk.pop();
dsu[dsu[t].fa].sz -= dsu[t].sz;
dsu[t].val = 0; dsu[t].fa = t;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
N = read(); M = read(); T = read();
for(int i = 1 ; i <= M ; ++i){
int a = read() , b = read() , l = read() , r = read();
if(l < r)
addEd(1 , 1 , T , l + 1 , r , PII(a , b));
}
for(int i = 1 ; i <= N ; ++i){
dsu[i].fa = i;
dsu[i].sz = 1;
}
solve(1 , 1 , T , 1);
return 0;
}
BZOJ4025 二分图 线段树分治、带权并查集的更多相关文章
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)
d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍 ...
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
- [BZOJ4025]二分图(线段树分治,并查集)
4025: 二分图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2191 Solved: 800[Submit][Status][Discuss] ...
- BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并
原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...
- BZOJ 2333 棘手的操作(离线+线段树+带权并查集)
这题搞了我一天啊...拍不出错原来是因为极限数据就RE了啊,竟然返回WA啊.我的线段树要开8倍才能过啊... 首先可以发现除了那个加边操作,其他的操作有点像线段树啊.如果我们把每次询问的联通块都放在一 ...
- hdu 1829 &poj 2492 A Bug's Life(推断二分图、带权并查集)
A Bug's Life Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- CodeForces - 687D: Dividing Kingdom II (二分图&带权并查集)
Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great ...
- How Many Answers Are Wrong (HDU - 3038)(带权并查集)
题目链接 并查集是用来对集合合并查询的一种数据结构,或者判断是不是一个集合,本题是给你一系列区间和,判断给出的区间中有几个是不合法的. 思考: 1.如何建立区间之间的联系 2.如何发现悖论 首先是如何 ...
随机推荐
- Oracle学习笔记四
一.PL/SQL编程 游标(光标Cursor) 为什么使用游标 在写java程序中有集合的概念,那么在pl/sq中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据. 语法: C ...
- [七]基础数据类型之Float详解
Float 基本数据类型float 的包装类 Float 类型的对象包含一个 float 类型的字段 属性简介 用来以二进制补码形式表示 float 值的比特位数 public sta ...
- spring源码分析之spring-jdbc模块详解
0 概述 Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作.下表描述了哪些是spring帮助我们做好的,哪些是我们要做的. Action Spring You ...
- 内核中 xxx_initcall 的调用过程分析
内核版本:linux-4.19 上一篇文章提到了这段代码: arch_initcall_sync(of_platform_default_populate_init); 它的功能是完成 device_ ...
- C# IQueryable和IEnumerable的区别
在使用EF查询数据的时候,我们常用的查询数据方式有linq to sql,linq to object, 查询返回的结果有两种类型:IQueryable.IEnumerable,两者内部的处理机制是完 ...
- [android] 相对布局和单位简介
/**********************2016年4月23日 更新*******************************/ 知乎:为何Android的默认布局是RelativeLayou ...
- 2018.12/6 js键盘事件 DOM:0级2级
DOM0级事件元素绑定多个click最后只执行最后一个click. DOM2级事件元素绑定多个click,都要执行 注意当绑定的多个事件名,函数名,事件发生阶段三者完全一样时,才执行最后一个 div. ...
- c++中求数组长度
#include <iostream> using namespace std; template <class T> int getArrSize(T& arr){ ...
- asp.net core webApi 参数保护
asp.net core webApi 参数保护 Intro asp.net core data protection 扩展,基于 IDataProtector 扩展的数据保护组件,自动化的实现某些参 ...
- Class.isAssignableFrom与instanceof的区别
isAssignableFrom 假设有两个类Class1和Class2.Class1.isAssignableFrom(Class2)表示: 类Class1和Class2是否相同. Class1是否 ...