【bzoj4025】二分图 LCT

题目描述

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

输入

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

输出

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

样例输入

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

样例输出

Yes
No
Yes


题解

LCT

考虑二分图的判断方法:没有奇环

那么我们可以按照每条边的出现时间从小到大排序。对于每条边,如果它形成了奇环,那么这个环上所有边的消失时间的最小值之后这个奇环就不复存在。

所以可以使用LCT维护以消失时间为关键字的最大生成树,每次加边时更新这棵生成树,同时如果产生了奇环,就把这个环上的最小消失时间加到桶中。每个时间把该时间的边弹掉,看是否还有其它形成奇环的边,如果有则不是二分图,否则是二分图。

判断是否是奇环可以通过维护size来实现,对于最大生成树,由于使用的是边权,所以需要想办法转化为点权。我们可以在要连接的两个点之间添加虚点,存着这条边的边权,这样边权就转化为了点权。记录一下消失时间最小的边(虚点)是哪个,判断与新边的大小关系,并决定删除哪个即可。

另外,本题卡常= = (其实本机开O2测才11s,不知道bz上怎么就20s++)

需要使用fread读入优化及puts输出才能勉强通过(还好时间没有在最后一页= =)

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
struct data
{int x , y , t1 , t2;
}a[N << 1];
int n , fa[N << 2] , c[2][N << 2] , si[N << 2] , w[N << 2] , mp[N << 2] , rev[N << 2] , num[N] , sum , now;
inline char nc()
{static char buf[100000] , *p1 , *p2;return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 100000 , stdin) , p1 == p2) ? EOF : *p1 ++ ;
}
inline int read()
{int ret = 0; char ch = nc();while(ch < '0' || ch > '9') ch = nc();while(ch >= '0' && ch <= '9') ret = (ret << 3) + (ret << 1) + ch - 48 , ch = nc();return ret;
}
bool cmp(data a , data b)
{return a.t1 < b.t1;
}
void pushup(int x)
{si[x] = si[c[0][x]] + si[c[1][x]] + 1;mp[x] = x;if(w[mp[c[0][x]]] < w[mp[x]]) mp[x] = mp[c[0][x]];if(w[mp[c[1][x]]] < w[mp[x]]) mp[x] = mp[c[1][x]];
}
void pushdown(int x)
{if(rev[x]){int l = c[0][x] , r = c[1][x];swap(c[0][l] , c[1][l]) , swap(c[0][r] , c[1][r]);rev[l] ^= 1 , rev[r] ^= 1 , rev[x] = 0;}
}
bool isroot(int x)
{return c[0][fa[x]] != x && c[1][fa[x]] != x;
}
void update(int x)
{if(!isroot(x)) update(fa[x]);pushdown(x);
}
void rotate(int x)
{int y = fa[x] , z = fa[y] , l = (c[1][y] == x) , r = l ^ 1;if(!isroot(y)) c[c[1][z] == y][z] = x;fa[x] = z , fa[y] = x , fa[c[r][x]] = y , c[l][y] = c[r][x] , c[r][x] = y;pushup(y) , pushup(x);
}
void splay(int x)
{update(x);while(!isroot(x)){int y = fa[x] , z = fa[y];if(!isroot(y)){if((c[0][y] == x) ^ (c[0][z] == y)) rotate(x);else rotate(y);}rotate(x);}
}
void access(int x)
{int t = 0;while(x) splay(x) , c[1][x] = t , pushup(x) , t = x , x = fa[x];
}
int find(int x)
{access(x) , splay(x);while(c[0][x]) pushdown(x) , x = c[0][x];return x;
}
void makeroot(int x)
{access(x) , splay(x);swap(c[0][x] , c[1][x]) , rev[x] ^= 1;
}
void link(int x , int y)
{makeroot(x) , fa[x] = y;
}
void cut(int x , int y)
{makeroot(x) , access(y) , splay(y) , fa[x] = c[0][y] = 0 , pushup(y);
}
void split(int x , int y)
{makeroot(x) , access(y) , splay(y);
}
void add(int p)
{int tx = a[p].x , ty = a[p].y , tmp , flag = 0;if(tx == ty && a[p].t2 > now) num[a[p].t2] ++ , sum ++ ;else{if(find(tx) != find(ty)) link(p + n , tx) , link(p + n , ty);else{split(tx , ty);if(!((si[ty] >> 1) & 1)) flag = 1;if(w[mp[ty]] >= a[p].t2) tmp = p;else tmp = mp[ty] - n , cut(tmp + n , a[tmp].x) , cut(tmp + n , a[tmp].y) , link(p + n , tx) , link(p + n , ty);if(flag && a[tmp].t2 > now) num[a[tmp].t2] ++ , sum ++ ;}}
}
int main()
{int m , t , i , p = 1;n = read() , m = read() , t = read();for(i = 1 ; i <= m ; i ++ ) a[i].x = read() , a[i].y = read() , a[i].t1 = read() , a[i].t2 = read();sort(a + 1 , a + m + 1 , cmp);for(i = 1 ; i <= n + m ; i ++ ) si[i] = 1 , mp[i] = i;for(i = 0 ; i <= n ; i ++ ) w[i] = 1 << 30;for(i = 1 ; i <= m ; i ++ ) w[i + n] = a[i].t2;for(i = 0 ; i < t ; i ++ ){now = i;while(p <= m && a[p].t1 <= i) add(p ++ );sum -= num[i];if(sum) puts("No");else puts("Yes");}return 0;
}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/7148985.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

世界500强高频逻辑推理智力面试题(一)

1、有一堆垃圾&#xff0c;规定要由张王 李三户人家清理。张户因外出没能参加&#xff0c;留下&#xff19;元钱做代劳费。王户上午起早干了&#xff15;小时&#xff0c; 李户下午接着干了&#xff14;小时刚好干完。问王户和李户应怎样分配这&#xff19;元钱&#xff1f; 答…

【51单片机快速入门指南】2.3:GPIO读取矩阵键盘 8个IO读16键

目录硬知识矩阵键盘介绍测试程序Key_Board.cKey_Board.hmain.c实验现象普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 选自《普中51单片机开发攻略_V1.2》 矩阵键盘介绍 独立按键与单片机连接时&#xff0c;每一个按键…

wordpress数据库表详解

表名&#xff1a;wp_commentmeta 仅存储Akismet或手工审核的评论是否为垃圾评论的判断结果。 字段注释meta_id自增唯一IDcomment_id对应评论IDmeta_keymeta_value表名&#xff1a;wp_comments 存储评论信息&#xff0c;如评论内容、评论所属文章、评论人昵称、邮箱、URL等&…

搭建LAMP

RPM包和源码包存放位置 /usr/local/src源码包编译安装位置 /usr/local/apache/usr/local/mysql/usr/local/php默认MySQL 数据库位置 /usr/local/mysql/var默认网站根目录 /usr/local/apache/htdocs2 LAMP环境搭建搭建的工作包括 mysql、apache、PHP。可以按照这个顺序来搭建环境…

JavaScript 计时器

1.定义计时器 (1).setInteral(函数名或代码,时间间隔). 注&#xff1a;每隔你定义的时间间隔执行一次你定义的函数或代码。 (2).setTimeout(函数名或代码,时间间隔). 注&#xff1a;setTimeout();严格意义上说不是定时器&#xff0c;它只是让代码延后执行&#xff0c;只会执行一…

【51单片机快速入门指南】2.4:74HC595、LED点阵屏及其SPI控制

目录硬知识IO 口扩展方式-串转并74HC595 芯片介绍硬件设计测试源码HC74595.cHC74595.hmain.h实验现象SPI控制普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 选自《普中51单片机开发攻略_V1.2》 IO 口扩展方式-串转并 …

Mongodb 安装和启动

一.首先去官网下载对应的的mongodb ,本人的操作系统是win7 64位 mongodb-win32-x86_64-2.0.6.rar 解压安装&#xff1a;进入到bin目录下&#xff0c;会看到N多的.exe文件 二.启动mongodb mongod.exe --dbpathd:\mongo\data\db --logpathd:\mongo\log\log.txt, 通过浏览器访问…

【51单片机快速入门指南】3:中断系统

目录硬知识中断概念中断系统中断结构中断优先级中断处理普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 选自《普中51单片机开发攻略_V1.2》、《STC89C52系列单片机器件手册》 中断概念 中断是为使单片机具有对外部或内…

正能量之项目经理的自我修养

正能量之项目经理的自我修养 作者&#xff1a;张子良 版权所有&#xff0c;转载请注明出处 引子 还记得曾经看过的《喜剧之王》么&#xff1f;还记的那曾经经典的台词么&#xff1a;“我不是死跑龙套的”&#xff0c;“人如果没有理想&#xff0c;和咸鱼又有什么区别呢&#xf…

20170505

RAID级别 raid0 为带区阵列&#xff1b;raid1 为镜像阵列raid01 为四块磁盘实现的荣誉磁盘阵列&#xff1b;raid5 至少三块&#xff0c;容量为&#xff08;n-1&#xff09;/n 广泛用于各种服务器&#xff1a;文件&#xff0c;数据库&#xff0c;web&#xff0c;邮件服务器 1.gi…

MVC4下配置log4net 五部曲

第一步&#xff1a;把log4net.dll 编译成Framework 4.0 第二步&#xff1a;找到项目的Properties下的AssemblyInfo。在最下面添加&#xff1a;[assembly: log4net.Config.XmlConfigurator(Watch true)]。 第三步&#xff1a;Web.config <configuration><configSectio…

算法,俄罗斯方块

炮姐的88行代码,亮瞎了..有待研究 #include <windows.h> #include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib.h> char gcText[] " 1LJTSZ#"; struct tetris {int _pool[16][32], (*pool)[32], tmap[8][4][16…

利用D触发器和异或门实现两个IO解读电机编码器的计数值和方向

目录反转变正转正转变反转iPad Pro 2020 14.8.1 仿真软件&#xff1a;iCircuit 突发奇想&#xff0c;做个记录。应该可以用于诸如51单片机、Arduino或是电赛中可能用到的MSP430G2553这类外设十分稀缺的单片机上。一个想法&#xff0c;啊&#xff0c;不一定对。 黄色波形是编码…

TCP协议的三次握手和四次分手

HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol )&#xff0c;是Web联网的基础&#xff0c;也是手机联网常用的协议之一&#xff0c;HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应&#xff0c;在请…

CountDownLatch线程同步辅助

2019独角兽企业重金招聘Python工程师标准>>> http://bughope.iteye.com/blog/2081935 在上一篇文章中写道用一个静态的变量保存线程的执行状态,并用时间等待的方法后来仔细考虑,其实是 线程不安全的.多个线程同时执行这个类时,这个静态变量的值就不能保证了. 用一个…

SQLServer链接服务器至Oracle

1. 我方服务器必须安装msdtc服务&#xff0c;并进行相应配置。 2. 我方服务器必须安装oracle client&#xff0c;这个要对应中心站oracle版本的客户端。 3. 我方服务器必须安装Oracle Services For Microsoft Transaction Server [版本] Oracle Provid…

【51单片机快速入门指南】3.1:配置外部中断触发方式和中断优先级

目录源码EXTI.cEXTI.hmain.c实验现象普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 源码 stdint.h见【51单片机快速入门指南】1&#xff1a;基础知识和工程创建 中断知识见【51单片机快速入门指南】3&#xff1a;中断系统 将…

(转)工厂方法模式

转自&#xff1a;http://www.jellythink.com/archives/62 问题描述 之前讲到了C设计模式——简单工厂模式&#xff0c;由于简单工厂模式的局限性&#xff0c;比如&#xff1a;工厂现在能生产ProductA、ProductB和ProductC三种产品了&#xff0c;此时&#xff0c;需要增加生产Pr…

一种父线程阻塞等待子线程的有效方法

最近在做一个查询优化时&#xff0c;考虑到一次查询耗时较多&#xff0c;所以打算用多线程来做&#xff0c;之前是串行查询。比如一个用户查询触发50个线程&#xff0c;在只有一个用户的情况下&#xff0c;性能比串行查询确实提高了许多&#xff0c;但当多个用户同时触发查询的…

C语言利用循环队列实现滑动平均值滤波器,提高计算速度

目录源码Filter.cFilter.h使用效果普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 串口示波器&#xff1a;Vofa 1.3.10 网上查到的滑动平均值滤波器在计算平均值的时候还要再for累加一遍&#xff0c;这太浪费时间了&#xff0c…