164_超大区域个数问题(坐标离散化,压缩)

解决区域个数问题时,由于行列数值过大,无法直接用数组表示。采用坐标离散化和矩阵压缩方法,将端点排序并去重,通过find方法确定实际坐标。注意unique方法不直接删除重复项,而是移到数组末尾作为标记,需配合erase方法删除。程序使用bfs而非dfs,保证可读性和维护性,同时补充了书中未给出的dx和dy转移方向。
摘要由CSDN通过智能技术生成

 区域个数问题,只不过行列都超大,无法在内存内搞数组来做。(下图来自《挑战程序竞赛》第二版 164页)



基本的做法就是进行矩阵压缩,使用坐标离散化的方法,对于行列的每个端点,加上做边的那个,再加上右边的那个,压入vector数组,排序,去除重复的元素,

然后用find方法找到端点的坐标,减去数组初始地址,便可求得压缩后的实际端点地址。

需要注意的又几点:

1. 程序中先排序,再使用了unique方法,unique 在数组中不是正真将重复的数据删去,只是讲重复的元素移到数组的末尾,比如:

{1,1,2,2,5,6,7} -> {1,2,5,6,7,1,2} 此时返回的是不重复的数组元素序列的最后一个元素的下一个元素地址(例子中为第二个1,类似于终止符的

作用);

2. 为了删除元素,要使用erase方法,讲上面所获得的元素地址到 数组末尾统统删除; 综合1,2 会有vector数组去重比较优雅的实现:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值