【算法】并查集+平衡树+数学+扫描线

【题解】

经典曼哈顿距离转切比雪夫距离。

曼哈顿距离: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 奶牛的邻居的更多相关文章

  1. BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    题目 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 Sec  Memory Limit: 64 MB Description ...

  2. bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)

    Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...

  3. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set

    Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...

  4. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604 题意: 平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9) ...

  5. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树

    大致题意:统计平面上由曼哈顿距离小于等于c的点对组成联通块的个数. 曼哈顿生成树的模板题.有关讲解:http://blog.csdn.net/acm_cxlove/article/details/88 ...

  6. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居【切比雪夫距离+并查集+multiset】

    参考:http://hzwer.com/4361.html 坐标开long long,inf开大点 先曼哈顿转切比雪夫(x+y,x-y),距离就变成了max(x',y'): 先按x排序,维护两个指针, ...

  7. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap

    题意:链接 方法: Treap 解析: 前几道资格赛的题水的不行,这道Gold的题就够分量辣. 首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发 ...

  8. 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1604 这题太神了... 简直就是 神思想+神做法+神stl.. 被stl整的我想cry...首先,, ...

  9. [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...

随机推荐

  1. loj2587 「APIO2018」铁人两项

    圆方树orz,参见猫的课件(apio和wc的)以及这里那里 #include <iostream> #include <cstdio> using namespace std; ...

  2. 第七篇Python基本数据类型之数字&字符串&布尔值

    数字 写在最前,必须要会的:int() 整型 Python3里无论数字多长都用int表示,Python2里有int和Long表示,Long表示长整型 有关数字的常用方法,方法调用后面都必须带括号() ...

  3. Python网络编程(socketserver、TFTP云盘、HTTPServer服务器模型)

    HTTP协议? HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型.HTTP是一个无状态的协议. 通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了 ...

  4. go 语言模拟百度登录

    1.参考网上Python的例子自己写了一个go语言的.这个仅供学习技术参考,为了方便有部分参数直接phantomjs执行js获取,代码基本都有注释,测试打印没有删除,还请见谅! 2.本文参考http: ...

  5. Linux 进程--父进程查询子进程的退出状态

    僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它 ...

  6. Visual Studio 2010安装包

    点击下载

  7. kinit

    su tf$ kinit -k -t /tmp/tf.keytab tf/admin@SINO.COM

  8. linux 命令小结(随时更新)

    代码备份命令: tar cvf 备份文件名 要备份的目录名 查看Linux服务器内存使用情况: 1.free命令 free -m [root@localhost ~]# free -m        ...

  9. 软工实践Beta冲刺(1/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  10. Mybatis学习系列(一)入门简介

    MyBatis简介 Mybatis是Apache的一个Java开源项目,是一个支持动态Sql语句的持久层框架.Mybatis可以将Sql语句配置在XML文件中,避免将Sql语句硬编码在Java类中.与 ...