题目简述:给定一个$n \times m$的二维矩阵$a[i][j]$,其中$1 \leq nm \leq 2 \times 10^5$,矩阵元素$1 \leq a[i][j] \leq nm$且互不相等。一个区间$[l, r]$是【好】的,如果所有在$[l, r]$范围内的元素(在平面上)构成了一棵树。求【好】区间$[l, r](1 \leq l \leq r \leq nm)$的个数。

解:code

建模:

令$G = (V, E)$表示二维矩阵$a[i][j]$对应的无向图,构造如下:

  1. $ V = \{ 1, 2, \dots, nm \}, $

  2. $ E = \{ (a[x_1][y_1], a[x_2][y_2]): (x1,y1)-(x2,y2) \in \{ (0, 1), (0, -1), (-1, 0), (1, 0) \} \}. $

注意到这个图的特殊性,即每个点的度数都$\leq 4$。

令$G_{l, r} = (V_{l, r}, E_{l, r})$表示$G$中包含节点$[l, r]$的子图,形式上,

  1. $V_{l, r} = V \cap [l, r], $

  2. $E_{l, r} = E \cap [l, r]^2. $

一个区间$[l, r]$是【好】的,如果$G_{l, r}$是一棵树。

对每个$1 \leq r \leq nm$,令$l_r$表示最小的$l$,使得$G_{l, r}$是无环图。则显然有$l_r \leq l_{r+1}$。

对每个$r$,我们需要求出$l_r$,可以用 Link-Cut Tree 在$O(nm \log nm)$的复杂度内做到。

令$c_{l, r}$表示$G_{l, r}$的 连通块/连通分支 (Connected Component) 的个数。

观察:$G_{l, r}$是一棵树,当且仅当$l_r \leq l \leq r$且$c_{l, r} = 1$。

因此,对每个$r$,只需统计$l \in [l_r, r]$中满足$c_{l, r} = 1$的个数。

现在我们考虑$c_{\cdot, r-1}$与$c_{\cdot, r}$的关系。

假设已知$l \in [l_r, r-1]$的$c_{l, r-1}$,设$(x, r) \in E_{l_r, r}$,则$l_r \leq x \leq r$,增加$(x, r)$这条边后,会将$x$与$r$所在的连通块合并,从而使$l \in [l_r, x]$时$G_{l, r}$比$G_{l, r-1}$的连通块个数,于是

$$ c_{l, r} = c_{l, r-1}+1 - \sum_{(x, r) \in E_{l_r, r}} [x \geq l]. $$

这个可以用线段树来维护:从$c_{l, r-1}$到$c_{l, r}$的过程,需要

  1. 区间$[l_r, r]$整体$+1$。

  2. 对$(x, r) \in E_{l_r, r}$,区间$[l_r, x]$整体$-1$。

其中,线段树节点维护的信息有:区间最小值,以及区间最小值出现的次数。

时间复杂度为$O(nm \log nm)$。

CodeForces 1109F. Sasha and Algorithm of Silence's Sounds的更多相关文章

  1. Codeforces 1109F - Sasha and Algorithm of Silence's Sounds(LCT)

    Codeforces 题面传送门 & 洛谷题面传送门 讲个笑话,这题是 2020.10.13 dxm 讲题时的一道例题,而我刚好在一年后的今天,也就是 2021.10.13 学 LCT 时做到 ...

  2. Codeforces Round #539 (Div. 1) 1109F. Sasha and Algorithm of Silence's Sounds LCT+线段树 (two pointers)

    题解请看 Felix-Lee的CSDN博客 写的很好,不过最后不用判断最小值是不是1,因为[i,i]只有一个点,一定满足条件,最小值一定是1. CODE 写完就A,刺激. #include <b ...

  3. [CF1109F]Sasha and Algorithm of Silence's Sounds

    题意 有一个\(n*m\)的网格,每个格子有一个数,为\(1\)~\(n * m\)的排列 一个区间\((1<=l<=r<=n*m)\)是好的,当且仅当:数值在该区间内的格子,构成一 ...

  4. CF1109F Sasha and Algorithm of Silence's Sounds LCT、线段树

    传送门 构成一棵树可以分成两个限制:图不成环.图的点数-边数=1. 我们考虑枚举右端点\(r\)计算所有可能的左端点\(l\)的答案.我们先考虑第一个限制:图不成环.注意到当\(r\)确定的时候,满足 ...

  5. Codeforces 1109D. Sasha and Interesting Fact from Graph Theory

    Codeforces 1109D. Sasha and Interesting Fact from Graph Theory 解题思路: 这题我根本不会做,是周指导带飞我. 首先对于当前已经有 \(m ...

  6. Codeforces 832A. Sasha and Sticks

    It's one more school day now. Sasha doesn't like classes and is always bored at them. So, each day h ...

  7. CodeForces 86D(Yandex.Algorithm 2011 Round 2)

    思路:莫队算法,离线操作,将所有询问的左端点进行分块(分成sqrt(n) 块每块sqrt(n)个),用左端点的块号进行排序小的在前,块号相等的,右端点小的在前面. 这样要是两个相邻的查询在同一块内左端 ...

  8. CodeForces 718C Sasha and Array

    线段树. 线段树维护区间矩阵和,操作都是最简单的线段树.$lazy$标记不要记录乘了几次,直接记录乘了几次之后的矩阵就可以了,不然每次下传的时候再算一遍时间复杂度会提高. #pragma commen ...

  9. Codeforces 1109D Sasha and Interesting Fact from Graph Theory (看题解) 组合数学

    Sasha and Interesting Fact from Graph Theory n 个 点形成 m 个有标号森林的方案数为 F(n, m) = m * n ^ {n - 1 - m} 然后就 ...

随机推荐

  1. LeetCode -- Flatten 二叉树

    这个题目主要考察二叉树的先序遍历. 1. 先序遍历2. 节点用队列存储3. 遍历队列,建立链表 实现: public class Solution { public void Flatten(Tree ...

  2. Unity3D研究院之拓展自定义编辑器窗口

    Unity支持自行创建窗口,也支持自定义窗口布局.在Project视图中创建一个Editor文件夹,在文件夹中在创建一条脚本. 自定义窗口需要让脚本继承EditorWindow在设置MenuItem, ...

  3. l两张图片轮播

    在head里面加 <script language="javascript"> function scroll(spanlevel) { if (spanlevel.s ...

  4. android菜鸟学习笔记12----Android控件(一) 几个常用的简单控件

    主要参考<第一行代码> 1.TextView: 功能与传统的桌面应用开发中的Label控件相似,用于显示文本信息 如: <TextView android:layout_width= ...

  5. Makefile注意点总结

    1 "="和":=" "="号赋值时,如果右边的值里面有未展开的变量,要等到整个Makefile的变量处理完之后,再展开,也就是说,如果该未 ...

  6. JS性能优化——加载和执行

    JavaScript 在浏览器中的性能,可以认为是开发者所面临得最严重的可用性问题.这个问题因JavaScript的阻塞特性变得复杂, 也就是说当浏览器在执行JavaScript代码时,不能同时做其他 ...

  7. BZOJ1415 聪聪和可可 —— 期望 记忆化搜索

    题目链接:https://vjudge.net/problem/HYSBZ-1415 1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 16 ...

  8. Mac OS 配置Maven

    步骤: 1. 下载Maven tar包 https://maven.apache.org/download.cgi?Preferred=http%3A%2F%2Fmirrors.tuna.tsingh ...

  9. smokeping高级配置

    摘自: http://mayulin.blog.51cto.com/1628315/514367 自定义报警 http://www.cnblogs.com/thatsit/p/6395506.html

  10. struts2的通配符与动态方法调用

    1.Action标签中的method属性 我们知道action默认的执行的方法是execute方法,但是一个action只执行一个方法我们觉得有点浪费,我们希望在一个action中实现同一模块的不同功 ...