题解/算法 {F - InterSections}
@LINK: https://atcoder.jp/contests/abc360/tasks/abc360_f
;
现在还不会这个题, 先看一下错误的思路把…
我们把题目中的原区间[l,r]
变成新区间[l+1, r-1]
后, 那么假如你选择L,R
他和新区间[l,r]
相交 等价于 (L在区间[l,r]里 且R不在) || (R在区间[l,r]里 且L不在)
;
.
其实后来我发现 这是错误的… 比如原区间[1,10]
新区间是[2,9]
, 如果按照上面的性质 那么L=9, R=10
是与他相交的, 但其实 他俩是不相交的;
因此上面的正确表述应该是(L在新区间[l,r]里 且R要么>=r+2 要么R<=l-2) || (R在...)
;
然后 我们令Points
是L,R
所有的可能取值, 对于任意原区间[l,r]
把l+1, l-1, r+1, r-1
放进去 (不确定正确性);
令CovInv[p]: 所有包含p点的新区间的并集区间; CovCont[p]: 所有包含p点的新区间的个数
;
.
他怎么求呢? 我们对Points
进行排序, 然后对于某点p
我们将所有左端点<=p
的区间的右端点rig
的哈希值 放到线段树里, 于是查询[p, INF]
里的最大值 就等于CovInv[p].second
;
然后我们枚举答案L
端点 得到CovInv[L] = {ll,lr}
, 那么关键是 怎么求答案端点R
呢? (当然R > L
)
.
首先看一个错误做法, 比如CovInv[R] = {rl, rr}
, 那么一定满足rl > lr
, 这是错误的, 其实lr, rl
是可以相交的 只要rl > lr
那么就不存在一个区间 同时覆盖L,R
;
于是 你想着 答案端点R
的rl
一定满足> L
(于是可以用map
配合upper_bound
找>L
的最大值);
.
其实这也是错误的… 因为rl
是可能<=L
的, 此时虽然会存在同时覆盖L,R
的区间, 但是这种情况 他可能会有最大的Cont
;
.
而且这种做法 可能还是错的… 因为上面讲的 对于一个新区间[l,r]
假如L
在其中 那么并不是说R
只要不在这个区间 那么L,R
就和他相交 不是的 只有当R>=r+2 || L<=l-2
时 才对答案有贡献;