题目
在一个$N\times M$的网格图上,有$Q$个操作。操作分三种:(1)将给定的矩形区域的边界围上围栏。(2)将给定的矩形区域的边界的围栏去掉。(3)问给定的两个格子有没有不穿过围栏的路。
数据范围
$1\le N,M \le 2500 \quad 1\le q \le 10^5$
做法
切入点:两个点$a,b$之间有不穿过围栏的路当且仅当包围$a$的围栏的集合和包围$b$的围栏的集合完全相等。
为了判断包围某个点的围栏集合是否相等,可以给每个围栏一个随机的值。操作1和操作2就变成了矩形区域的加、减(抑或也可以),操作3就是查询某个点的值。区间修改,单点查询,可以转化为:单点修改,区间查询。这样用二维树状数组就行。
为了提高成功的概率,可将每个围栏的int
值变为pair<int, int>
。
代码
|
|