传送门


如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集

但是每条边有消失时间。这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上。

然后遍历整棵线段树,每遍历到一个点将覆盖这个点对应区间的边全部加入带权并查集中,递归到叶子节点输出答案。回溯的时候把在这一个点加入的边从并查集中栈序撤销。

因为需要撤销所以并查集不能使用路径压缩,只能按秩合并。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<stack>
  4. #include<vector>
  5. //This code is written by Itst
  6. using namespace std;
  7. inline int read(){
  8. int a = 0;
  9. char c = getchar();
  10. while(!isdigit(c))
  11. c = getchar();
  12. while(isdigit(c)){
  13. a = a * 10 + c - 48;
  14. c = getchar();
  15. }
  16. return a;
  17. }
  18. const int MAXN = 1e5 + 7;
  19. int N , M , T;
  20. #define PII pair < int , int >
  21. #define st first
  22. #define nd second
  23. #define mid ((l + r) >> 1)
  24. #define lch (x << 1)
  25. #define rch (x << 1 | 1)
  26. vector < PII > Edge[MAXN << 2];
  27. void addEd(int x , int l , int r , int L , int R , PII Ed){
  28. if(l >= L && r <= R){
  29. Edge[x].push_back(Ed);
  30. return;
  31. }
  32. if(mid >= L) addEd(lch , l , mid , L , R , Ed);
  33. if(mid < R) addEd(rch , mid + 1 , r , L , R , Ed);
  34. }
  35. struct node{
  36. int fa , val , sz;
  37. }dsu[MAXN];
  38. PII find(int x){
  39. if(dsu[x].fa == x) return PII(x , 0);
  40. PII t = find(dsu[x].fa);
  41. return PII(t.st , t.nd ^ dsu[x].val);
  42. }
  43. void solve(int x , int l , int r , bool f){
  44. stack < int > stk;
  45. for(vector < PII > :: iterator t = Edge[x].begin() ; t != Edge[x].end() ; ++t){
  46. int p = (*t).st , q = (*t).nd;
  47. PII M = find(p) , N = find(q);
  48. int m = M.st , n = N.st;
  49. if(m != n){
  50. if(dsu[m].sz > dsu[n].sz)
  51. swap(n , m);
  52. dsu[n].sz += dsu[m].sz;
  53. dsu[m].fa = n;
  54. dsu[m].val = M.nd ^ N.nd ^ 1;
  55. stk.push(m);
  56. }
  57. else
  58. f &= (M.nd ^ N.nd);
  59. }
  60. if(l == r)
  61. puts(f ? "Yes" : "No");
  62. else{
  63. solve(lch , l , mid , f);
  64. solve(rch , mid + 1 , r , f);
  65. }
  66. while(!stk.empty()){
  67. int t = stk.top(); stk.pop();
  68. dsu[dsu[t].fa].sz -= dsu[t].sz;
  69. dsu[t].val = 0; dsu[t].fa = t;
  70. }
  71. }
  72. int main(){
  73. #ifndef ONLINE_JUDGE
  74. freopen("in","r",stdin);
  75. freopen("out","w",stdout);
  76. #endif
  77. N = read(); M = read(); T = read();
  78. for(int i = 1 ; i <= M ; ++i){
  79. int a = read() , b = read() , l = read() , r = read();
  80. if(l < r)
  81. addEd(1 , 1 , T , l + 1 , r , PII(a , b));
  82. }
  83. for(int i = 1 ; i <= N ; ++i){
  84. dsu[i].fa = i;
  85. dsu[i].sz = 1;
  86. }
  87. solve(1 , 1 , T , 1);
  88. return 0;
  89. }

BZOJ4025 二分图 线段树分治、带权并查集的更多相关文章

  1. [BZOJ 4025]二分图(线段树分治+带边权并查集)

    [BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...

  2. UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)

    d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍 ...

  3. bzoj4025二分图(线段树分治 并查集)

    /* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...

  4. [BZOJ4025]二分图(线段树分治,并查集)

    4025: 二分图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2191  Solved: 800[Submit][Status][Discuss] ...

  5. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并

    原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...

  6. BZOJ 2333 棘手的操作(离线+线段树+带权并查集)

    这题搞了我一天啊...拍不出错原来是因为极限数据就RE了啊,竟然返回WA啊.我的线段树要开8倍才能过啊... 首先可以发现除了那个加边操作,其他的操作有点像线段树啊.如果我们把每次询问的联通块都放在一 ...

  7. hdu 1829 &amp;poj 2492 A Bug&#39;s Life(推断二分图、带权并查集)

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  8. 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 ...

  9. How Many Answers Are Wrong (HDU - 3038)(带权并查集)

    题目链接 并查集是用来对集合合并查询的一种数据结构,或者判断是不是一个集合,本题是给你一系列区间和,判断给出的区间中有几个是不合法的. 思考: 1.如何建立区间之间的联系 2.如何发现悖论 首先是如何 ...

随机推荐

  1. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增模块管理界面导出功能(可按条件导出)

    导出功能在很多应用场景中都需要,RDIFramework.NET V3.2版本在模块管理界面新增了导出功能,方便管理员对所有配置的模块进行管理. 一.Web版模块管理导出功能 Web版本的模块导出功能 ...

  2. [八]JavaIO之FileInputStream 与 FileOutputStream

    接下来介绍 FileInputStream  和 FileOutputStream 现在看名字应该可以看得出来: 他就是从一个文件中读取数据 或者将数据写入到一个文件中 FileInputStream ...

  3. java web 项目打包(war 包)并部署

    1.在eclipse中右键单击项目,然后Export选择WAR file,生成项目的WAR文件.具体步骤请看图片详细操作步骤: 2.把生成的WAR文件放到tomcat解压之后的webapps文件夹下. ...

  4. 基于MVC的网站和在线教育系统

    最近老表说要创业,想要做一个网站做宣传,还想要一个在线教育系统. 学习了一部分 Java,  决定用.Net MVC做官网或直接做成静态HTML网站,主要是因为.Net MVC 技术简单,效率高,需求 ...

  5. 介绍Dynamics 365 Performance Center

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复257或者20170517可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  6. SVN上传的时候没法显示文件名,只显示后缀名

    之前在用SVN上传android代码的时候,发现上传列表上的文件没法显示名字,只显示了后缀名,就像这样: 各种疑惑,最终发现解决方法: 右键单击操作栏的status: 然后在出现的选项里面将filen ...

  7. 怎么使用Fiddler进行抓包

    启动Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开“Fiddler Options”对话框.      在Fiddler Options”对话框切换到“Co ...

  8. mssql sqlserver获取指定月份当月天数总和

    摘要: 下文通过sql函数的形式,获取指定月份的总天数 实验环境:sqlserver 2008 R2 制作思路: 1. 获取指定月份的第一天, 2. 并采用dateadd向后加一个月形成一个新的日期 ...

  9. Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh

    本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...

  10. IOS判断NSArray是否为空

    场景描述:判断一个集合是否为空,如果不为空执行A,如果为空执行B Java实现方法 public void exec(){ List<String> list = this.getCont ...