题目传送-BZOJ4025

题意:

有一张\(n\)个节点的无向图,其中边\(i\)在\(s_i\)出现,\(e_i\)结束,并连接着节点\(x,y\).
并保证\(s_i < e_i \le T\),要求对于每个时间\(t\le T\)输出此时的图是否是二分图。
\(n\le100000,m\le200000,T\le100000\)

题解:

这是道好题,考到了线段树(分治)的思想,听说也叫整体二分?
考虑如何做一个区间(时间)[L,R]中的所有答案:
显然我们只考虑与这个区间有交集的边
分两种:完全覆盖这个区间,部分覆盖这个区间。
显然我们可以毫无顾虑的把第一类的边都加上
此时如果已经不是二分图了,那显然直接GG了
然后对于其它边我们只要递归下去处理就行了
如何判断二分图并支持对图的修改:
考虑按秩合并的带权并查集,这就不多说了
复杂度的证明:
空间:
观察发现每个区间的处理需要有一个边集
而每条边最多能在log个区间中出现(线段树的思想)
那么总共的空间需求就是\(m*log_2T\)的
时间:
同样一条边只能与log个区间相关,也就是说它只能被删加log次
所以复杂度也是\(m*log_2T\)的?
不知道我这样分析对不对,貌似@zhouzhendong大佬说这是\(log^2\)的

过程:

已更新至我都错题集-updating
并查集相关错误

代码:

const int N=100010,M=200010;
int n,m,T;
struct EDGE {int x,y,s,t;inline void in() {read(x); read(y); read(s); read(t); ++s;}
};
int ans[N];
int cnt=0;
namespace DSU {int val[N],dep[N],fat[N];struct TMP {int fx,fy,dx,dy;};//x merge to y -> dep[fx]<dep[fy]stack<TMP> sta;inline void Init() {for(int i=1;i<=n;i++) fat[i]=i,dep[i]=1,val[i]=0;}inline pii father(int x) {int ret=0;while(x!=fat[x]) ret^=val[x],x=fat[x];return mp(x,ret);}inline bool Merge(int x,int y) {pii tx=father(x),ty=father(y);int fx=tx.F,fy=ty.F,vx=tx.S,vy=ty.S;if(dep[fx]>dep[fy]) swap(fx,fy);int v=1^vx^vy;if(fx==fy) return v==0;sta.push((TMP) {fx,fy,dep[fx],dep[fy]});fat[fx]=fy; val[fx]=v;dep[fy]=max(dep[fy],dep[fx]+1);return true;}inline void Split(int to) {--cnt; assert(cnt>=0);while((int)sta.size()!=to) {// puts("?");assert(!sta.empty());TMP tmp=sta.top(); sta.pop();int fx=tmp.fx,fy=tmp.fy,dx=tmp.dx,dy=tmp.dy;dep[fx]=dx; dep[fy]=dy; fat[fx]=fx; val[fx]=0;}}
}
vector<EDGE> E;
void Solve(int S,int T,vector<EDGE> &E) {assert(S<=T);if((int)E.size()==0) {for(int i=S;i<=T;i++)ans[i]=1;return;}++cnt;vector<EDGE> EL,ER; EL.clear(); ER.clear();int top=DSU::sta.size(),mid=(S+T)>>1;for(int i=0;i<(int)E.size();i++) {EDGE e=E[i];if(e.s<=S && T<=e.t) {if(!DSU::Merge(e.x,e.y)) {// puts("???");for(int j=S;j<=T;j++)ans[j]=0;DSU::Split(top); return;} } else {if(e.s<=mid) EL.push_back(e);if(e.t> mid) ER.push_back(e);}}if(S==T) {ans[S]=1; DSU::Split(top); return;}Solve(S,mid,EL); Solve(mid+1,T,ER);DSU::Split(top); return;
}
signed main() {// freopen("10.in","r",stdin);// freopen("my.out","w",stdout);mem(ans,-1);read(n); read(m); read(T);DSU::Init();for(int i=1;i<=m;i++) {EDGE e; e.in(); E.push_back(e);}Solve(1,T,E);// for(int i=1;i<=n;i++) printf("%d ",ans[i]);for(int i=1;i<=n;i++) puts(ans[i] ? "Yes" : "No");return 0;
}
/*
3 3 3
1 2 0 2
2 3 0 3
1 3 1 2
*/

用时:1h

转载于:https://www.cnblogs.com/functionendless/p/9470217.html

[BZOJ 4025] 二分图相关推荐

  1. bzoj 4025: 二分图(可撤销并查集+CDQ分治)

    4025: 二分图 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1726  Solved: 641 [Submit][Status][Discus ...

  2. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  3. BZOJ 4025 二分图

    题目大意 给定一个\(n\)个点, \(m\)条边的无向图, 每条边在一定时间范围内存在. 要你判断每个时间点这张图是否为二分图. \(n \le 10^5\) \(m \le 2 \times 10 ...

  4. BZOJ 1059 - 二分图匹配

    之前一直把矩阵的元素以为是给定的\(m\)以内- 然后才发现- ​ 哔了狗了- ​ 二分图匹配咯- 如果第\(i\)行第\(j\)列是黑色,那么在代表这一行和这一列的两个节点之间连边.然后匈牙利算法跑 ...

  5. BZOJ 1443 二分图博弈 网络流

    思路: 二分图博弈嘛 找到最大匹配的必须点 跑个网络流 前后DFS一遍 //By SiriusRen #include <queue> #include <cstdio> #i ...

  6. BZOJ 4808 二分图最大点独立集

    4808: 马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗 称"蹩马腿"), ...

  7. BZOJ 4808 二分图最大独立集

    思路: 棋盘是个二分图 那就把一个可以走的白点  向所有可以走的黑点连边 跑一个最大匹配   (匹配上了就代表这两个点不能共存) 最大独立集=sum-最大匹配 //By SiriusRen #incl ...

  8. python字典的存储结构_解决python字典结构内存暴涨问题

    背景:当读取一个key value数据的时候,python的字典结构会造成内存使用扩10倍左右,无可容忍.此文解决这个问题 数据:word2vec训练的结果,word对应400维的词向量.词表共1.6 ...

  9. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

最新文章

  1. mysql-5.6 升级 5.7
  2. 植物MWAS研究—谷子产量与微生物组关联分析
  3. KVM 虚拟机在 IBM System x 上应用_图文详解桥接网络配置
  4. 简单纯文字浮动信息-Tooltip
  5. 1001种玩法 | 1001种玩法--数据存储(2)
  6. php符号教程,PHP教程:网站开发编程中的特殊符号处理_php
  7. leetcode 188. 买卖股票的最佳时机 IV(dp)
  8. kafka配置文件server.properties
  9. 大数据可视化分析方法与流程
  10. iptables(3)
  11. GUI输出中文为乱码解决方式
  12. java 颜色渐变算法_颜色渐变的RGB计算
  13. Taro从零创建微信小程序步骤
  14. win7怎么设置开机密码_主编教您电脑开机密码怎么设置
  15. Android 在后台无法启动Activity
  16. 旧貌换新颜 | 凯云科技整装待发,迎风飞扬
  17. 视频编解码 — SVC可伸缩性
  18. 见闻-关于codec芯片
  19. DAO是什么?——为什么有人试图购买美国宪法?
  20. html生成无序列表,HTML的ul无序列表

热门文章

  1. CentOS 7 使用iptables防火墙
  2. [LeetCode] 35. Search Insert Position
  3. AutoMapper搬运工之自定义类型转换
  4. 搭建wordpress开发环境
  5. ASP.NET MVC3 中的AJAX
  6. Kotlin 学习笔记08
  7. 初识react(二) 实现一个简版的html+redux.js的demo
  8. 国产毫米波雷达领域的领头羊,木牛科技将在明年量产77GHz汽车雷达
  9. [已解决]Vistual Stdio 2015 installer Bootstrapper Packages 路径
  10. 【原创】Git删除暂存区或版本库中的文件