当前位置: 首页 > 编程日记 > 正文

BZOJ 4025 二分图

题目大意

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

Solution

我们考虑一个合法的二分图有什么性质: 图中不存在奇环, 即环上边数(点数)为奇数的环.
考虑如何判断每个时刻是否存在奇环. 考虑我们把一条边加入一张图中可能的情况:

  • 将两个不联通的块连接在一起. 不会产生新的奇环.
  • 将一棵树上的两个点连接在一起. 假如这两个点之间的路径上的点数为奇数, 则会产生奇环; 否则不会产生奇环.
  • 将一张图上的两个点连接在一起. 我们考虑这张图是由一棵树, 再加上一些边形成的. 我们假设在加入这条边之前的图中不存在奇环, 则假如树上这两点间的路径上的点数为奇数, 则会产生奇环; 否则不会产生奇环. 换而言之, 之前存在的偶环不影响答案.

因此我们用link-cut tree维护这张图. 我们又考虑到边会消失, 因此每次我们加入一条边时, 进行如下讨论:

  • 假如这条边连接的是两颗不相连的树, 则直接加入这条边
  • 假如这条边连接的是一棵树上的两个点, 则考虑是否需要更新答案. 同时我们还需要用这条边更新两点间树上所有连边中最早消失的一条(即删掉最早消失的边, 并且连接上当前边. 当然, 假如当前边的消失时间早于最早消失的边, 则不用作任何修改).

这样即可保证任意两个相连的点之间, 最晚消失的边存在于树上, 因而保证正确性.

#include <cstdio>
#include <cctype>
#include <algorithm>using namespace std;
namespace Zeonfai
{inline int getInt(){int a = 0, sgn = 1; char c;while(! isdigit(c = getchar())) if(c == '-') sgn *= -1;while(isdigit(c)) a = a * 10 + c - '0', c = getchar();return a * sgn;}
}
const int N = (int)1e5, M = (int)2e5, INF = (int)2e9, T = (int)1e5;
int n, m;
int ans[T + 1];
struct edge
{int u, v, L, R;inline int operator <(const edge &a) const {return L == a.L ? R < a.R : L < a.L;}
}edg[M];
struct linkCutTree
{int tp;struct node{int pre, suc[2], isRoot, rev;int w, mn, sz;inline node() {pre = -1; for(int i = 0; i < 2; ++ i) suc[i] = -1; isRoot = 1; rev = 0; sz = 1;}}nd[N + 1 + M];inline void initialize(){for(int i = 1; i <= n; ++ i) nd[i].w = INF, nd[i].mn = i;tp = n + 1;}inline void pushDown(int u){if(! nd[u].isRoot) pushDown(nd[u].pre);if(nd[u].rev){for(int i = 0; i < 2; ++ i) if(~ nd[u].suc[i])swap(nd[nd[u].suc[i]].suc[0], nd[nd[u].suc[i]].suc[1]), nd[nd[u].suc[i]].rev ^= 1;nd[u].rev = 0;}}inline int getRelation(int u) {return u == nd[nd[u].pre].suc[1];}inline void update(int u){nd[u].mn = u; nd[u].sz = 1;for(int i = 0; i < 2; ++ i) if(~ nd[u].suc[i]){if(nd[nd[nd[u].suc[i]].mn].w < nd[nd[u].mn].w) nd[u].mn = nd[nd[u].suc[i]].mn;nd[u].sz += nd[nd[u].suc[i]].sz;}}inline void rotate(int u){int pre = nd[u].pre, prepre = nd[pre].pre, k = getRelation(u);nd[pre].suc[k] = nd[u].suc[k ^ 1]; if(~ nd[u].suc[k ^ 1]) nd[nd[u].suc[k ^ 1]].pre = pre;nd[u].pre = prepre; if(! nd[pre].isRoot) nd[prepre].suc[getRelation(pre)] = u;nd[pre].pre = u; nd[u].suc[k ^ 1] = pre;if(nd[pre].isRoot) nd[pre].isRoot = 0, nd[u].isRoot = 1;update(pre); update(u);}inline void splay(int u){pushDown(u);while(! nd[u].isRoot){if(! nd[nd[u].pre].isRoot) rotate(getRelation(u) == getRelation(nd[u].pre) ? nd[u].pre : u);rotate(u);}}inline void access(int u){splay(u);if(~ nd[u].suc[1]){nd[nd[u].suc[1]].isRoot = 1;nd[u].suc[1] = -1; update(u);}while(~ nd[u].pre){int pre = nd[u].pre;splay(pre);if(~ nd[pre].suc[1]){nd[nd[pre].suc[1]].isRoot = 1;nd[pre].suc[1] = -1; update(pre);}nd[pre].suc[1] = u; nd[u].isRoot = 0; update(pre);splay(u);}}inline void makeRoot(int u){access(u); swap(nd[u].suc[0], nd[u].suc[1]); nd[u].rev ^= 1;}inline int get(int u){access(u);while(~ nd[u].suc[0]) u = nd[u].suc[0];return u;}inline int newNode(int w) {nd[tp].w = w; nd[tp].mn = tp; return tp ++;}inline void link(int id){int u = edg[id].u, v = edg[id].v;if(get(u) == get(v)){makeRoot(u); access(v);int x = nd[v].mn;if(nd[x].w > edg[id].L && nd[v].sz + 1 >> 1 & 1) for(int i = edg[id].L + 1; i <= min(nd[x].w, edg[id].R); ++ i) ans[i] = 1;if(nd[x].w > edg[id].R) return;access(x); nd[nd[x].suc[0]].pre = -1; nd[nd[x].suc[0]].isRoot = 1; nd[x].suc[0] = -1;makeRoot(v); access(x); nd[nd[x].suc[0]].pre = -1; nd[nd[x].suc[0]].isRoot = 1; nd[x].suc[0] = -1;}makeRoot(u); makeRoot(v);int x = newNode(edg[id].R); nd[x].pre = u; nd[v].pre = x;return;}
}LCT;
int main()
{#ifndef ONLINE_JUDGEfreopen("graph.in", "r", stdin);freopen("graph.out", "w", stdout);#endifusing namespace Zeonfai;n = getInt(), m = getInt(); int T = getInt();LCT.initialize();for(int i = 0; i < m; ++ i) edg[i].u = getInt(), edg[i].v = getInt(), edg[i].L = getInt(), edg[i].R = getInt();sort(edg, edg + m);for(int i = 0; i < m; ++ i) LCT.link(i);for(int i = 1; i <= T; ++ i) puts(! ans[i] ? "Yes" : "No");
}

转载于:https://www.cnblogs.com/ZeonfaiHo/p/7502056.html

相关文章:

javascript对象之window对象详解

frames 表示当前窗口中所有frame对象的数组 status 表示浏览器的状态行信息 defaultstatus 表示浏览器的状态行信息 history 表示当前窗口的历史记录,这可以引用在网页导航中 closed 表示当前窗口是否关闭的逻辑值 document 表示当前窗口中显示的当前文档对象 location 表示当前…

Wsus简单笔记

一&#xff1a;安装前的要求1&#xff1a;iis6.0以上&#xff0c;bits、Asp.net2.02:sql20053:Microsoft Management Console 3.04:microsof report viewer redistributable 20055&#xff1a;ntsf分区二&#xff1a;安装1&#xff1a;过程比较简单&#xff0c;注意设置本地补丁…

机器学习-Sklearn

Scikit learn 也简称 sklearn, 是机器学习领域当中最知名的 python 模块之一. Sklearn 包含了很多种机器学习的方式:Classification 分类 Regression 回归 Clustering 非监督分类 Dimensionality reduction 数据降维 Model Selection 模型选择 Preprocessing 数据预处理 我们总…

[翻译]自动维护索引重新生成组织的SQL批处理语句

脚本来自《Inside Server 2005 T-SQL Programming》 SET NOCOUNT ON;DECLARE objectid int;DECLARE indexid int;DECLARE partitioncount bigint;DECLARE schemaname nvarchar(258);DECLARE objectname nvarchar(258);DECLARE indexname nvarchar(258);DECLARE partitionnum bi…

DTrace memory leak 内存泄露

http://blog.sina.com.cn/s/blog_538040b70100eecn.html如下程序用于跟踪&#xff0c;在分配和回收都会触发探针 #!/usr/sbin/dtrace -s pid$target:libc:malloc:entry{ self->trace 1; self->size arg0;}pid$target:libc:malloc:return/self->trace 1/{ …

Spark的安装和使用

Spark2.1.0入门&#xff1a;Spark的安装和使用 Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0(2.7.1)/Ubuntu14.04(16.04) 手把手教你在VirtualBox中与主机共享文件夹

SQL Server 2005系列教学(6) 多表操作及子查询

多表查询&#xff1b;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />人事表&#xff1a; 公司表&#xff1a;姓名性别年龄姓名公司地址张三男25李四女25张三新…

(点)分治学习笔记

哗我看了一下好像没有很详细专门讲分治的blog&#xff1f;那就主要先学一下点分治吧&#xff0c;其他的……等我记得把C一本通带到机房来再说吧先咕着啦 写在前面 刷题进度 入门题&#xff08;0/3&#xff09; 好题(0/9) 问题解决进度 Q1 Q2 正文 淀粉质 点分治 点分治就是在一…

十五个步骤收获学习的习惯

"真正的发现的航程&#xff0c;并非是在寻找新的土地,而且用新的视界去寻找"--普鲁斯特 "智慧日进者方值得尊敬。"-林肯 "我从不让我在学校所学的干扰我的教育"-马克吐温 如果公立学校尚未摧残你的灵魂&#xff0c;那么学习是一项极佳的活动。它…

熟悉scala命令,scala语言运行超级素数和猴子大王

实验目的 在Linux操作系统中安装Scala输入“scala”命令&#xff0c;熟悉地运行Scala解释器scala语言运行超级素数和猴子大王实验仪器 Virtualbox管理器 实验框图&#xff08;电路图/流程图&#xff09; 在Windows中使用VirtualBox安装Ubuntu&#xff0c;安装好scala后&#xf…

安装mayavi和VTK库的血泪史

一开始安装VTK库是从官网上下载&#xff0c;但是怎么都找不到whl文件&#xff0c;只有exe文件&#xff08;vtkpython-7.1.1-Windows-64bit.exe&#xff09;。下载安装之后再PyCharm中import vtk出错。当时认为是文件出错。后来在一篇博客&#xff08;Python下VTK 编程 - lj6952…

Python LEGB (Local, Enclosing, Global, Build in) 规则

1 Local 一个函数定义了一个 local 作用域; PyFrameObject 中的 f_local 属性2 Global 一个 module 定义了一个 global 作用域; PyFrameObject 中的 f_global 属性.3 BuiltIn open, dir 的作用域等等, python 最顶层的作用…

图解DotNet框架系列

图解.Net框架系列(索引贴) (声明:本系列已完成,故索引帖重发) 众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinForm,Service,Mobile等等. 这么复杂和庞大的框架,用文字来描述是远远不够的,所以我准备写一系列图文并茂的文…

【Linux基础】文件处理实例

1.文件拆分 //每4000行拆分一个文件 split -l 4000 epms_t_ep_fx_stl_xy_20190129.dat 2.行处理 //查找第二列为711611且第三列为711100记录&#xff0c;打印行号和整行数据 awk -F ‘^C’ {if ($3711100 && $2711611) print NR,$0 } epms_t_ep_fx_stl_xy_20190229.d…

scala语言运行递归“分鱼”程序

A、B、C、D、E 五人在某天夜里合伙去捕鱼&#xff0c;到第二天凌晨时都疲惫不堪&#xff0c;于是各自找地方睡觉。 日上三杆&#xff0c;A 第一个醒来&#xff0c;他将鱼分为五份&#xff0c;把多余的一条鱼扔掉&#xff0c;拿走自己的一份。 B 第二个醒来&#xff0c;也将鱼分…

smarty_modifier_truncate,无或者有md_substr的情况下都能正确截取字符串的php函数,可用于smarty。...

smarty_modifier_truncate,无或者有md_substr的情况下都能正确截取字符串的php函数&#xff0c;可用于smarty。function smarty_modifier_truncate($string, $length 80, $etc ..., $codeutf8, $mbtrue) { if ($length 0) return $string; if(function_exists("mb_subs…

java基础小总结(2)

Day07&#xff1a; 1.如果局部变量和全局变量都有相同的数据类型和变量名&#xff0c;先调用局部变量&#xff0c;实现就近原则&#xff1b; 2.匿名对象由于局限性的原因&#xff0c;一般只调用一次&#xff0c;且只是当作为实际参数传递的时候使用&#xff1b; 3.面向对象语言…

Wireshark实验HTTP

在 Wireshark 实验入门里&#xff0c;我们已经初步使用了 Wireshark 包嗅探器&#xff0c;我们现在可以操作 Wireshark 来查看网络协议。在这个实验中&#xff0c;我们会探索 HTTP 协议的几个方面&#xff1a;基本的 GET/response 交互&#xff0c;HTTP 消息格式&#xff0c;检…

2、安装ICS(Internet Component Suite)控件

下载完成后解压到你的指写目录&#xff01;1、在library里加入ICS->Delphi->Vc32目录。2、从File->Open中打开ICS->Delphi->Vc32->IcsDel110.dproj文件。(文件名在其它Delphi版本略有不同)3、在项目管理器中&#xff0c;右键IcsDel110.bpl选择Build和Install…

定制CE系统随笔-续1

更改用户界面颜色[HKEY_LOCAL_MACHINE\SYSTEM\GWE] "SysColor"hex: 00,00,00,00, 3A,6E,A5,00, 00,00,00,00, 00,00,00,00,\ EF,EB,DE,00, FF,FF,FF,00, 00,00,00,00, 00,00,00,00,\ 00,00,00,00, FF,F…

安装包安全测试

主要说明以下内容&#xff1a;1、能否反编译代码2、安装包是否签名3、完整性校验4、权限设置检查反编译代码&#xff1a;移动应用发布出去后最终用户获得的是一个程序安装包&#xff0c;我们需要关注的是用户能否从这个安装包中获取项目的源代码&#xff0c;从安全方面考虑&…

Java课程寒假之开发记账本软件(网页版)之二

一.实现基础功能之一&#xff08;记账&#xff09; 一个记账本最基础之一的功能就是记账&#xff0c;所以也是首先要解决的问题&#xff0c;我选择了上学期使用的MySQL数据库来对账本进行存储。 我选择记账的方法是分开记账&#xff0c;就是支出放在一个表&#xff0c;收入放在…

谷歌浏览器Google Chrome和Adobe Flash Plugins插件安装问题

最近在做CSS的多浏览器支持&#xff0c;于是安装上了谷歌浏览器Google Chrome浏览器&#xff0c;结果发现谷歌浏览器Google Chrome的确构造非常简单&#xff0c;精干&#xff0c;速度非常迅猛&#xff0c;比臃肿的IE8快多了&#xff0c;于是开始使用谷歌浏览器Google Chrome&am…

Wireshark实验 - 入门

# Wireshark实验 - 入门 **官方英文文档&#xff1a;[Wireshark_Intro_v6.0.pdf](Wireshark_Intro_v6.0.pdf)** **以下内容为笔者翻译&#xff1a;** *** ## Wireshark 实验: 入门 v6.0 **《计算机网络&#xff1a;自顶向下方法&#xff08;第6版&#xff09;》补充材料&…

观察者模式的经典应用(猫叫 烧开水)

Code 猫叫了 老鼠跑 主人惊醒 1/**//* 2 * 题目&#xff1a; 3 * 猫叫了&#xff0c;所有老鼠开始逃跑&#xff0c;主人被惊醒&#xff0c;请用OO的思想描绘此过程 4 * 1&#xff0c;老鼠跟主人是被动的 5 * 2&#xff0c;要考虑联动性与扩展性 6 */ 7using System; 8using Sys…

HTML学习笔记之基本介绍

超文本标记语言 (Hyper Text Markup Language&#xff0c;HTML&#xff09;不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;用一套标记标签描述网页 HTML 标记标签又被称为 HTML 标签&#xff08;HTML Tag&#xff09;&#xff0c;它是由尖括号包围的关键词&#xf…

系统分析与设计 实验一用例模型

图书管理系统系统分析及用例图 图书管理系统能够为一定数量的借阅者提供服务。每个借阅者能够拥有唯一标识其存在的编号。图书馆向每一个借阅者发放图书证&#xff0c;图书证中包含每一个借阅者的编号和个人信息。系统通过一个单独的程序为借阅者提供服务&#xff0c;不需要管理…

2017.9.12.语文

列夫尼古拉耶维奇托尔斯泰&#xff08;Лев Николаевич Толстой&#xff0c;1828年9月9日&#xff0d;1910年11月20日&#xff09;19世纪中期俄国批判现实主义作家、思想家、哲学家。 转载于:https://www.cnblogs.com/mldyz/p/7510750.html

一封会笑死人的校园情书

Kiss郝美丽&#xff1a; Sorry&#xff01;我把Miss拼成了Kiss&#xff0c;一不小心吻了你&#xff0c;实在是对不起&#xff01; 吾本良家子弟&#xff0c;正统少年&#xff0c;一向对美眉们保持一种昂首挺胸&#xff0c;目不斜视的高姿态&#xff0c;人送美名…

Java面试题之多线程同步和互斥有几种实现方法,都是什么?

线程同步是指线程之间所具有的一种制约关系&#xff0c;一个线程的执行依赖另外一个线程的消息&#xff0c;当它没有得到另一个线程的消息时应等待&#xff0c;直到消息到达时才被唤醒。 线程互斥是指对于共享的进程系统资源&#xff0c;每个线程访问时的排他性。当有若干个线程…