欢迎来看 “片” (的简介)
由于-\(看片\)-生涯转瞬即逝,于是我选择对“\(片\)”进行一定的总结:
相信你一定看懂了
由于开始的时间有一点晚,就姑且认为我以后会慢慢补充吧......
\(CF1270H\) \(Number\) \(of\) \(Components\)
解:线段树
首先我们可以发现连通块都是以区间的形式存在的
所以如果我们把一个值设为基准,大于它的是 \(1\),小于它的是\(0\)
如果有其中一个点不与后者形成连通块就会有形如:
\(111……111……1100……000……000\)
于是我们只需要为护对于每个基准数,它所形成的零一串有几个 \(10\)
这要形式的区间,当它有一个的时候就说明它能形成新的连通块
因此只需要维护有多是个 \(1\) 即可,现在人为将 \(0\) 的位置设为极大值
这样对于任何数而它的 \(10\) 个数一定大于等于 \(1\),所以 \(1\) 是最小值
这时候维护最小值和最小值的个数就可以了
so……
为啥不能直接维护区间 \(1\) 的个数
因为主席树不好写\(????????????????????????????????????????????????????????\)
\(WOPSIM\) 吧
maojun:这东西没那么容易,“哦,我知道你在说什么了,但是这个东西应该叫做“兔队线段树”,如果你不这样的话可能要用类似楼房重建的做法 \(log^2\)”
fine…………………………………………………………
上面只是目标,下面是具体实现思路
除此以外,我们还有一个重要的发现,对于两个 \(a[i]\), \(a[i\pm 1]\) 是只能
它们作为基准是只会对 \([min(a[i],a[i \pm 1]),max(a[i],a[i \pm1]))\)有影响的
--------这里为什么不用考虑顺序呢?-------
这是因为开头和结尾有极大值和极小值,所以,对于 \(01\) 的情况,由于开头是 \(1\), 结尾是 \(0\), 所以对于这种非法情况,最后肯定会排除,因为它们构成了新的 \(01\)
啊哈,于是修改操作就显而易见了,把区间内的智障加一就行了!!!
标签:连通,01,个数,片集,最小值,111,区间,数据结构 From: https://www.cnblogs.com/Aaron-Yao-Aloe/p/18316812