【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
【算法】并查集+平衡树+数学+扫描线
【题解】
经典曼哈顿距离转切比雪夫距离。
曼哈顿距离:S=|x1-x2|+|y1-y2|<=c
即:max(x1-x2+y1-y2,x1-x2-y1+y2,-x1+x2+y1-y2,-x1+x2-y1+y2)
令X1=x1+y1,Y1=x1-y1,则转化为
切比雪夫距离:S=max(|X1-X2|,|Y1-Y2|)<=c。
为什么要转化为切比雪夫距离?因为这种形式很容易操作。
想象两者的几何意义,哈夫曼距离<=c是竖着的正方形,而切比雪夫距离<=c是以一个点为中心的正方形(边平行于坐标轴)。
则问题转化为询问每个正方形,其内部包含的点,经典扫描线。
不过对于这题来讲,还需要一些小技巧来实现传递性。
首先一维排序,另一维用平衡树维护,也就是将排序后的点依次在平衡树上找到前驱和后继,然后再加入平衡树。
这样做就是对于每个点(x,y),在<x的点中找到<y的第一个点和>y的第一个点连边并加入并查集(相等看x)。
从而,每个点只向前面连边,而y只向前面的相邻的点连边,最大限度避免重复统计。
复杂度O(n log n)。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<set>
using namespace std;
const int maxn=;
struct cyc{
int y,d;
bool operator < (const cyc &a)const{
return y<a.y||(y==a.y&&d<a.d);
}
};
struct node{int x,y;}a[maxn];
set<cyc>s;
set<cyc>::iterator it;
int fa[maxn],n,c,b[maxn];
int read(){
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
bool cmp(node a,node b){return a.x<b.x;}
int main(){
n=read();c=read();
for(int i=;i<=n;i++){
a[i].x=read();a[i].y=read();
a[i]=(node){a[i].x+a[i].y,a[i].x-a[i].y};
}
sort(a+,a+n+,cmp);
int l=;
s.insert((cyc){a[].y,});
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=n;i++){//一边往前,一边两端
while(a[i].x-a[l].x>c)s.erase((cyc){a[l].y,l}),l++;
it=s.lower_bound((cyc){a[i].y,i});
if(it!=s.end()&&it->y-a[i].y<=c&&find(i)!=find(it->d))fa[fa[i]]=fa[it->d];
if(it!=s.begin()&&a[i].y-(--it)->y<=c&&find(i)!=find(it->d))fa[fa[i]]=fa[it->d];
s.insert((cyc){a[i].y,i});
}
int mx=,num=;
for(int i=;i<=n;i++)b[find(i)]++;
for(int i=;i<=n;i++)if(b[i]){
num++;
if(b[i]>mx)mx=b[i];
}
printf("%d %d",num,mx);
return ;
}
【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居的更多相关文章
- BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
题目 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 Sec Memory Limit: 64 MB Description ...
- bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...
- BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604 题意: 平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9) ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树
大致题意:统计平面上由曼哈顿距离小于等于c的点对组成联通块的个数. 曼哈顿生成树的模板题.有关讲解:http://blog.csdn.net/acm_cxlove/article/details/88 ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居【切比雪夫距离+并查集+multiset】
参考:http://hzwer.com/4361.html 坐标开long long,inf开大点 先曼哈顿转切比雪夫(x+y,x-y),距离就变成了max(x',y'): 先按x排序,维护两个指针, ...
- BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap
题意:链接 方法: Treap 解析: 前几道资格赛的题水的不行,这道Gold的题就够分量辣. 首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发 ...
- 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1604 这题太神了... 简直就是 神思想+神做法+神stl.. 被stl整的我想cry...首先,, ...
- [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
[BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...
随机推荐
- Spring MVC - URL路径映射
1. 普通映射 A. @RequestMapping("/test1") B. @RequestMapping(value={"/test1", "/ ...
- java线程池技术
1.线程池的实现原理?简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Apache 配置说明
ServerRoot ServerRoot: The top of the directory tree under which the server's configuration, error, ...
- vue2.0 $emit $on组件通信
在vue1.0中父子组件通信使用$dispatch 和 $broadcast,但是在vue2.0中$dispatch 和 $broadcast 已经被弃用. 因为基于组件树结构的事件流方式实在是让人难 ...
- Java并发基础--多线程基础
一.多线程基础知识 1.进程和线程 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程:进程也是程序的一次执行过程,是系统运行程序的基本单位:系统运行 ...
- 剑指offer-二叉树的镜像18
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- 九度OJ--1163(C++)
#include <iostream>#include <vector> using namespace std; int main() { int n; while(cin& ...
- AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程 0x00 项目简述 Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本.Ammbr打算创建具有人工智能和智 ...
- npm安装不成功的原因
使用npm安装electron不成功的解决方法 使用npm安装electron不成功的解决方法 根据官网提供的electron的npm安装方法,使用下面的命令进行安装,结果不成功 npm instal ...
- ubuntu apache2配置,包括虚拟机配置
虚拟机设置好了之后,需要在/etc/hosts里面添加 127.0.0.1 www.baidu.com 跟在windows里hosts里配置是一样的