【xsy2506】 bipartite 并查集+线段树
题目大意:有$n$个点,你需要操作$m$次。每次操作为加入/删除一条边。
问你每次操作后,这$n$个点构成的图是否是二分图。
数据范围:$n,m≤10^5$。
此题并没有强制在线,考虑离线做法。
一条边在某个时间被加入,然后又被删除。
设这条边出现的时间为$[l,r]$,我们开一棵线段树,在对应的区间上标记出这一条线段。
最后我们遍历整个线段树,把这些线段往并查集上加,同时维护当前点的颜色,然后简单判断下就没了。
这个并查集需要支持撤销操作,所以不能路径压缩,需要按秩合并
时间复杂度:$O(n\log^2\ n)$。
#include<bits/stdc++.h>
#define M 100005
#define mid ((a[x].l+a[x].r)>>1)
using namespace std; int f[M]={},siz[M]={},val[M]={}; int get(int x){return x==f[x]?x:get(f[x]);}
int getdis(int x){return x==f[x]?:val[x]+getdis(f[x]);}
int n,m,ok=;
map<int,int> mp[M]; struct seg{
int l,r; vector<int> u,v,F;
void add(){
int S=u.size();
for(int i=;i<S;i++){
int U=get(u[i]),V=get(v[i]);
if(U==V){
if((getdis(u[i])+getdis(v[i]))%==) ok=;
F.push_back(-); continue;
}
if(siz[U]<siz[V]){swap(U,V); swap(u[i],v[i]);}
int d=getdis(u[i])+getdis(v[i]);
F.push_back(V); f[V]=U; val[V]=(d+)&; siz[U]+=siz[V];
}
}
void del(){
int S=u.size();
for(int i=S-;~i;i--){
if(F[i]==-) continue;
int U=get(u[i]),V=F[i];
siz[U]-=siz[V];
f[V]=V; val[V]=;
}
} }a[M<<]={}; void build(int x,int l,int r){
a[x].l=l; a[x].r=r; if(l==r) return;
build(x<<,l,mid); build(x<<|,mid+,r);
}
void updata(int x,int l,int r,int U,int V){
if(l<=a[x].l&&a[x].r<=r){a[x].u.push_back(U); a[x].v.push_back(V);return;}
if(l<=mid) updata(x<<,l,r,U,V);
if(mid<r) updata(x<<|,l,r,U,V);
} int solve(int x){
int lastok=ok;
a[x].add();
if(ok==) for(int i=a[x].l;i<=a[x].r;i++) printf("NO\n");
else if(a[x].l==a[x].r) printf("YES\n");
else solve(x<<),solve(x<<|);
a[x].del();
ok=lastok;
} int main(){
scanf("%d%d",&n,&m);
build(,,m);
for(int i=;i<=n;i++) f[i]=i,siz[i]=;
for(int i=;i<=m;i++){
int u,v; scanf("%d%d",&u,&v);
if(u<v) swap(u,v);
if(mp[u][v]){
updata(,mp[u][v],i-,u,v);
mp[u][v]=;
}else mp[u][v]=i;
}
for(int i=;i<=n;i++){
for(map<int,int>::iterator it=mp[i].begin();it!=mp[i].end();it++)
if(it->second)
updata(,it->second,m,i,it->first);
}
solve();
}
【xsy2506】 bipartite 并查集+线段树的更多相关文章
- UVA1455 - Kingdom(并查集 + 线段树)
UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...
- 并查集&线段树&树状数组&排序二叉树
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
- 并查集 + 线段树 LA 4730 Kingdom
题目传送门 题意:训练指南P248 分析:第一个操作可以用并查集实现,保存某集合的最小高度和最大高度以及城市个数.运用线段树成端更新来统计一个区间高度的个数,此时高度需要离散化.这题两种数据结构一起使 ...
- YYHS-猜数字(并查集/线段树维护)
题目描述 LYK在玩猜数字游戏. 总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi. 我们总能构造出一种方案使得LY ...
- luogu5012 水の数列 (并查集+线段树)
如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...
- 【CF471E】MUH and Lots and Lots of Segments 扫描线+并查集+线段树+set
[CF471E]MUH and Lots and Lots of Segments 题意:给你平面上n条水平或竖直的,端点在整点处的线段.你需要去掉一些线段的一些部分,使得剩下的图形:1.连通,2.无 ...
- bzoj 3237 连通图 - 并查集 - 线段树
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 Connected Disconne ...
随机推荐
- 2019.01.21 bzoj2989: 数列(二进制分组+主席树)
传送门 二进制分组入门题. 主席树写错调题2h+2h+2h+体验极差. 题意简述:给一堆点,支持加入一个点,询问有多少个点跟(x,y)(x,y)(x,y)曼哈顿距离不超过kkk. 思路:题目要求的是对 ...
- xml 转 数组
function xml_to_array($xml){ if(!$xml){ return false; } //将XML转为array //禁止引用外部xml实体 libxml_disable_e ...
- 内联/块级元素的宽高及margin/padding的说明 |||||| 为何img、input等内联元素可以设置宽、高
1,内联非替换元素设置宽高是无效的,设置margin时,左右有效,上下无效.设置padding时,左右有效,而上下padding比较奇葩,内联非替换元素的上下padding会在元素内容盒不动的情况下上 ...
- ext中对json数据的处理解析
看贴:http://blog.csdn.net/xieshengjun2009/article/details/5959687
- HDU 2147 kiki's game (奇偶博弈)
题意:给定一个 n * m 的格子,从右上角(1, m) 开始每个玩家只能从向下,向左,或者向左下走,谁不能走,谁输. 析:自己做出来,看了网上的几个博客,好像都没说为什么是只有全奇的情况才会输,个人 ...
- 好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界
好文原文地址:http://segmentfault.com/a/1190000000354555 本文将首先介绍grunt-markdown插件如何配合HTML模板使用,接着我将介绍如何使用grun ...
- 未找到导入的项目“C:\Program Files\MSBuild\Microsoft\Silverlight\v5.0\Microsoft.Silverlight.CSharp.targets”。
问题描述: 原先创建的Silverlight程序,后来系统重装了,再打开Silverlight程序时提示:C:\Users\yzg\Desktop\ocr\TJSilverlight\TJSilver ...
- MIT Molecular Biology 笔记5 转录机制
视频 https://www.bilibili.com/video/av7973580?from=search&seid=16993146754254492690 教材 Molecular ...
- POJ3616--Milking Time(动态规划)
Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that sh ...
- Java关联关系、依赖关系
关联关系 概念:对象和对象之间的连接 定义:A类关联B类,指的是B类对象作为A类的属性存在,称为“has”关联关系 生命周期:如果A类关联B类,那么创建A类的对象时实例化B类的对象,直到A类对象被销毁 ...