原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4025

二分图

Description

神犇有一个n个节点的图。因为神犇是神犇,所以在T时间内一些边会出现后消失。神犇要求出每一时间段内这个图是否是二分图。这么简单的问题神犇当然会做了,于是他想考考你。

Input

输入数据的第一行是三个整数n,m,T。

第2行到第m+1行,每行4个整数u,v,start,end。第i+1行的四个整数表示第i条边连接u,v两个点,这条边在start时刻出现,在第end时刻消失。

Output

输出包含T行。在第i行中,如果第i时间段内这个图是二分图,那么输出“Yes”,否则输出“No”,不含引号。

Sample Input

3 3 3
1 2 0 2
2 3 0 3
1 3 1 2

Sample Output

Yes
No
Yes

HINT
样例说明:

0时刻,出现两条边1-2和2-3。

第1时间段内,这个图是二分图,输出Yes。

1时刻,出现一条边1-3。

第2时间段内,这个图不是二分图,输出No。

2时刻,1-2和1-3两条边消失。

第3时间段内,只有一条边2-3,这个图是二分图,输出Yes。

数据范围:

n<=100000,m<=200000,T<=100000,1<=u,v<=n,0<=start<=end<=T。

题解

偶然发现一篇咕咕咕了多年的题解,顺手水一波。

这么好的题当然要用LCT\mathcal{LCT}LCT,把出现一条边看做linklinklink,消失看做cutcutcut,按时间将操作离线,如果出现了奇环,这就是个二分图。

但是这是个图,LCT\mathcal{LCT}LCT总有linklinklink出环的时候,所以我们只在LCT\mathcal{LCT}LCT中保存一个以删除时间为关键值的最大生成树,linklinklink时如果出现了环,将删除时间最早的边从LCT\mathcal{LCT}LCT中删去,如果形成的是奇环,还要进行标记,奇环数+1+1+1;

删除时,如果该边本来就在LCT\mathcal{LCT}LCT里,直接删去。如果不在LCT\mathcal{LCT}LCT里且为我们标记过的奇环边,去掉标记,奇环数−1-1−1。

在本时间点的操作全部做完以后,根据奇环数回答询问即可。

代码
#include<bits/stdc++.h>
#define ls son[v][0]
#define rs son[v][1]
using namespace std;
const int M=1e6+5;
struct sd{int op,a1,a2,t,id;};
struct ed{int a1,a2,t;};
bool operator <(sd a,sd b){return a.t<b.t;}
int dad[M],son[M][2],siz[M],mn[M],val[M],n,m,t,top,ans;
bool rev[M],gg[M],on[M];sd ope[M];ed edge[M];
bool notroot(int v){return son[dad[v]][1]==v||son[dad[v]][0]==v;}
void up(int v)
{siz[v]=(v>n)+siz[ls]+siz[rs];mn[v]=v;if(val[mn[v]]>val[mn[ls]])mn[v]=mn[ls];  if(val[mn[v]]>val[mn[rs]])mn[v]=mn[rs];
}
void turn(int v){swap(ls,rs);rev[v]^=1;}
void down(int v){if(!rev[v])return;if(ls)turn(ls);if(rs)turn(rs);rev[v]=0;}
void push(int v){if(notroot(v))push(dad[v]);down(v);}
void spin(int v)
{int f=dad[v],ff=dad[f],k=son[f][1]==v,w=son[v][!k];if(notroot(f))son[ff][son[ff][1]==f]=v;son[v][!k]=f,son[f][k]=w;if(w)dad[w]=f;dad[f]=v,dad[v]=ff;up(f);
}
void splay(int v){push(v);for(int f,ff;notroot(v);spin(v)){f=dad[v],ff=dad[f];if(notroot(f))spin((son[f][0]==v)^(son[ff][0]==f)?v:f);}up(v);}
void access(int v){for(int f=0;v;v=dad[f=v])splay(v),rs=f,up(v);}
void beroot(int v){access(v);splay(v);turn(v);}
void split(int x,int y){beroot(x);access(y);splay(y);}
void link(int x,int y){beroot(x);dad[x]=y;}
void cut(int x,int y){split(x,y);dad[x]=son[y][0]=0;up(y);}
int findroot(int v){access(v);splay(v);while(ls)push(v),v=ls;return v;}
void in()
{int a,b,c,d,i;for(scanf("%d%d%d",&n,&m,&t),memset(val,127,sizeof(val)),i=1;i<=m;++i)scanf("%d%d%d%d",&a,&b,&c,&d),val[n+i]=d,ope[++top]=(sd){0,a,b,c,i},ope[++top]=(sd){1,a,b,d,i},edge[i]=(ed){a,b,d};
}
void deal1(int x,int y,int id,int lim)
{int hh;if(x==y){ans++;gg[id]=1;return;}beroot(x);if(findroot(y)!=x){link(y,id+n);link(x,id+n);on[id]=1;return;}else{split(x,y);if(val[mn[y]]<lim){hh=mn[y]-n;if(siz[y]&1^1)gg[hh]=1,ans++;cut(edge[hh].a1,hh+n);cut(edge[hh].a2,hh+n);link(x,id+n);link(y,id+n);on[hh]=0;on[id]=1;}else if(siz[y]&1^1)gg[id]=1,ans++;}
}
void deal2(int x,int y,int id){if(on[id])cut(x,id+n),cut(y,id+n),on[id]=0;else if(gg[id])gg[id]=0,ans--;}
void ac()
{sort(ope+1,ope+1+top);for(int i=0,j=1,x,y,id;i<t;ans?puts("No"):puts("Yes"))for(++i;ope[j].t<i&&j<=top;++j){x=ope[j].a1,y=ope[j].a2,id=ope[j].id;ope[j].op?deal2(x,y,id):deal1(x,y,id,edge[id].t);}
}
int main(){in();ac();}

BZOJ4025 二分图相关推荐

  1. bzoj4025: 二分图

    这题想不出来. 不浪费时间了. 以后找时间填. --------------------update--------------- 就是判奇环咯 然而LCT我搞不出来.. 是因为对于当前的最大生成树, ...

  2. 【知识点总结】【CSP考前复习】图论大杂烩【未完】

    序言 临近NOIP CSP-J 2019,不由得有些惆怅. 惆怅不是为了别的,主要是觉得从接触信息学竞赛开始,这已经是四个年头了,却一直拿的是二等奖.而今年是我最后的机会.如果不能成功,那自然就是AF ...

  3. 每周记录(4月底停更了qvq)

    1月6日 旋转卡壳 闵可夫斯基和 1月13日 期末复习 1月20日 网络流前4道题 一场失败的期末考试 写寒假作业 bzoj [HNOI2008]明明的烦恼(90分) prufer序列 正睿 画画图 ...

  4. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  5. 【bzoj4025】二分图 LCT

    题目描述 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. 输入 输入数据的第一行是三 ...

  6. [BZOJ 4025] 二分图

    题目传送-BZOJ4025 题意: 有一张\(n\)个节点的无向图,其中边\(i\)在\(s_i\)出现,\(e_i\)结束,并连接着节点\(x,y\). 并保证\(s_i < e_i \le ...

  7. POJ - 3041 Asteroids 二分图最小点覆盖

    题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...

  8. P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

    二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; const int MAXN = 5550; const int MAX ...

  9. 图论:关于二分图的总结(转载)

    二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y. 最大匹配:图中包含边数最多的匹配称为图的最大匹配. 完美匹配:如果所有点都在匹配边 ...

  10. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

最新文章

  1. 手动将jar包导入pom依赖,让jar包适配本地maven项目
  2. 2021世界人工智能大会最高奖项——卓越人工智能引领者奖(Super AI Leader,简称SAIL奖)在大会开幕式揭晓...
  3. 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)
  4. SAP中SD客户投诉退货的处理方案
  5. Java中的参数传递 --Java
  6. 图数据库Neo4j的介绍与使用
  7. 可信赖的服务器监控系统,可信赖的网络监控系统,源于专业和专注.PDF
  8. mysql recordcount 1_[转载]ADO记录集GetRecordCount()返回记录条数为啥总为-1
  9. 软件测试52讲-用机器设计测试用例:基于模型的测试
  10. Web开发基本准则-55实录-Web访问安全
  11. kali linux 黑别人电脑,如何使用 Kali Linux 黑掉 Windows
  12. PDf无法双面打印解决方式
  13. 仿微信语音输入页面(讯飞语音)
  14. fusioncharts java_FusionCharts在Java中的基本使用(2)
  15. 我的世界java版动作优化_我的世界动作优化模组
  16. 电脑微软商店消失解决办法
  17. 网络游戏——强联网游戏
  18. ad打开ddb文件_如何用AD10打开DDB文件
  19. 众创空间和共享办公室有什么不同吗
  20. 数据分析面试:Excel必考知识点!

热门文章

  1. Linux防火墙iptables配置详解
  2. Raki的读paper小记:How to Fine-Tune BERT for Text Classification?
  3. Android studio 报错 Gradle sync failed 你的主机中的软件中止了一个已建立的连接
  4. 《Web漏洞防护》读书笔记——第12章,CSRF跨站点请求伪造防护
  5. 常用软件版本查看Windows下
  6. git 创建和合并分支
  7. 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
  8. Linux Unix shell 编程指南学习笔记(第二部分)
  9. TRUNCATE TABLE command not allowed within multi-statement transaction
  10. 用inno 打包程序 学习之路(转载)