USACO Shaping Regions 线段树加离散化解法

我的代码仿照参考参考文献1写出,关于线段树的详细说明见薛矛的论文

1.线段树

线段树的每个节点设一个表示线段起点和终点的域(start, end),若该节点的线段长度大于1,则以(start+end)/2为中点将其扩展为两颗子树。线段树的叶子节点长度是1。

2.离散化

我查到的资料中,这道题的离散化一般是这样实现的:设每个矩形的左右两条边投影到x轴且去除重复点后个数位x_num,则创建一颗根节点长度位x_num的线段树,并另设一个数组表示各个点的实际坐标。y轴也用一个数组表示y轴各个点的实际坐标。然后分别统计y轴各个相邻点之间的染色情况,每次统计前要恢复x轴的线段树, 重新染色为0。

去除重复点时可以用标记数组实现,我为了节省空间用的是位操作。

3.代码见参考文献1,这是我查到的用线段树解这题的写的最好的代码。

参考文献:

[1] http://www.pediy.com/bbshtml/bbs7/pediy7-733.htm

[2] 薛矛 ,解决动态统计问题的两把利刃 ——剖析线段树与矩形切割

原文地址:https://www.cnblogs.com/siyuan/p/2113229.html