Treap 的妙用。
Source
https://www.lydsy.com/JudgeOnline/problem.php?id=2658
Solution
First
直觉告诉我们:「至少一个」是不好直接做的。
因此考虑补集转换:用「选出一个子矩形的所有方案数」减去「子矩形内没有资源点的方案数」。
「选出一个子矩形的所有方案数」比较显然:
r×(r+1)2×c×(c+1)2 r × ( r + 1 ) 2 × c × ( c + 1 ) 2
而下面就考虑怎么求「子矩形内没有资源点的方案数」。
Second
考虑使用扫描线来求解。具体的思路就是设一个 pos p o s ,从第一行移到最后一行,在移动的过程中,维护出:
「所有的子矩形 [l,pos][a,b] [ l , p o s ] [ a , b ] (即表示行号从 l l 到
,列号从 a a 到
)中,没有资源点的子矩形个数」。
设这个时候, 定义一个 w[i] w [ i ] ( 1≤i≤c 1 ≤ i ≤ c ):
表示第 i i 列,行号在
范围内,位置最下(行号最大)的资源点的编号。
这时候,假设固定