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.如何发现悖论 首先是如何 ...
随机推荐
- Java开发知识之Java的异常处理
Java开发知识之Java的异常处理 一丶异常概述 在讲解异常之前,我们要搞清楚.什么是异常. 通俗理解就是我们编写的程序出问题了.进行处理的一种手段. 比如我们的QQ.有的时候就崩溃了.比如出现xx ...
- 简述ADO.NET(一)
ADO.NET 宏观定义 传统ADO主要针对紧密连接的客户端/服务器端系统,而 ADO.NET考虑到了断开连接式应用并且引进了 Dateset 它代表任意数量的关联表,其中每个表都包含了行和列的集合的 ...
- php 日期时间类型带毫秒
<?php date_default_timezone_set('PRC'); $mtimestamp = sprintf("%.3f", microtime(true)); ...
- mysql修改连接数
方法一: 进入MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起M ...
- SpringBoot 整合 apollo
简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景 ...
- Spring学习心得--------bean-Factory
在学习Spring框架的过程中发现,Spring中的bean不仅是对javabean的一种封装,让你可以通过beanfactoryAPI读取自己配置的beans.xml文件来实现javabean的设置 ...
- JS之This的用法
This的用法 This作为JavaScript中的关键字,在函数中具有四种用法. 一.直接在函数中使用,谁调用这个函数,this就指向谁 例如: var n = "指我"; fu ...
- java-自定义数据排序
导读:由于基本类型的数据都实现了一个共同的接口java.lang.Comparable接口,都实现了该接口下面的compareTo()方法,因此想要利用面向对象实现现实生活中的一些情景再现,比如新闻根 ...
- SAP MM 实施项目里Open PO 迁移思路探讨
SAP MM 实施项目里Open PO 迁移思路探讨 .序言. SAP项目上线前夕,除了静态主数据需要导入以外,可能还有一些动态数据,比如open的采购订单,open的销售订单等单据也要迁移到SA ...
- Linux tail 命令
tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件. tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只 ...