[BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(multiset+并查集)

博客探讨了如何使用Multiset和并查集解决Usaco2008 Open中的一道题目,即找到奶牛之间的哈弗曼距离。文章介绍了将坐标转化为(x+y,x-y)来简化二维距离判断为一维,并通过维护一维差不超过特定值的Multiset,查询每个点最近的相邻点,利用并查集进行合并的方法。" 127058334,12315882,Redis实战:分布式锁、Session共享、秒杀与数据一致性,"['redis', '数据库', 'java']
摘要由CSDN通过智能技术生成

题目描述

传送门

题解

刚开始想的是每一次只查询某一个点左下角离他最近的点,做4遍
这应该是可做的,但是为了练习stl (偷懒)想用set做,结果发现并不可做
因为貌似set的lower_bound只适用于一个关键字
splay可做!

后来得知了一种很强的方法
就是把一个点的坐标变成(x+y,x-y)
两个点的哈弗曼距离也就变成了两维的距离的max
按照一维排序了之后,维护multiset中的点在这一维的差不超过c,然后对于每一个点查询其左边离他最近的两个点(上下各一个),如果另一维也满足不超过c说明可以合并
用并查集搞一下就行了

…写了这么久…写splay也写完了啊…

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值