大致题意:统计平面上由曼哈顿距离小于等于c的点对组成联通块的个数。

  曼哈顿生成树的模板题。有关讲解:http://blog.csdn.net/acm_cxlove/article/details/8890003

  

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 100100
#define MAXE MAXN*8
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
typedef long long qword;
int n,m;
struct edge
{
int x,y;
qword d;
}e[MAXE];
int tope=-;
bool cmp_d(edge e1,edge e2)
{
return e1.d<e2.d;
}
int uf[MAXN];
int get_fa(int now)
{
return uf[now]==now ? now : uf[now]=get_fa(uf[now]);
}
int comb(int x,int y)
{
x=get_fa(x);
y=get_fa(y);
if (x==y)return false;
uf[x]=y;
return true;
}
struct point
{
qword x,y;
int id;
}pl[MAXN];
bool cmp_x(point p1,point p2)
{
if (p1.x==p2.x)return p1.y>p2.y;
return p1.x>p2.x;
}
void rotate1()
{
for (int i=;i<n;i++)
pl[i].x=-pl[i].x;
}
void rotate2()
{
for (int i=;i<n;i++)
pl[i].y=-pl[i].y;
}
void rotate3()
{
for (int i=;i<n;i++)
swap(pl[i].x,pl[i].y);
}
qword h[MAXN],toph=-;
qword tarr[MAXN];
int tarr_id[MAXN];
void Add_tarr(int pos,qword v,int id)
{
while (pos<MAXN)
{
tarr[pos]=min(tarr[pos],v);
if (v==tarr[pos])tarr_id[pos]=id;
pos+=pos&(-pos);
}
}
pair<qword,int> Qry_tarr(int pos)
{
pair<qword,int> ret;
ret.first=INFL;
while (pos)
{
ret.first=min(ret.first,tarr[pos]);
if (ret.first==tarr[pos])
ret.second=tarr_id[pos];
pos-=pos&(-pos);
}
return ret;
}
void work()
{
int i,j;
toph=;
memset(tarr,0x3f,sizeof(tarr));
for (i=;i<n;i++)
h[++toph]=pl[i].x-pl[i].y;
sort(h+,h+toph+);
toph=unique(h+,h+toph+)-h-;
sort(pl,pl+n,cmp_x);
for (i=;i<n;i++)
{
pair<qword,int> pr;
qword t=pl[i].x-pl[i].y;
t=lower_bound(h+,h+toph+,t)-h;
pr=Qry_tarr(t);
if (pr.first!=INFL)
{
e[++tope].x=pl[i].id;
e[tope].y=pr.second;
e[tope].d=pr.first-pl[i].x-pl[i].y;
}
Add_tarr(t,pl[i].x+pl[i].y,pl[i].id);
}
}
int is_root[MAXN],uf_size[MAXN];
int main()
{
freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int i,j,k,x,y,z;
scanf("%d%d",&n,&m);
for (i=;i<n;i++)
{
scanf("%lld%lld",&pl[i].x,&pl[i].y);
pl[i].id=i;
}
//
work();
//
rotate3();
work();
rotate3();
//
rotate2();
rotate3();
work();
rotate3();
rotate2();
//
rotate2();
work();
rotate2();
//
rotate2();
rotate1();
work();
rotate1();
rotate2();
//
rotate1();
rotate2();
rotate3();
work();
rotate3();
rotate2();
rotate1();
//
rotate1();
rotate3();
work();
rotate3();
rotate1();
//
rotate1();
work();
rotate1();
sort(e,e+tope+,cmp_d);
for (i=;i<=n;i++)uf[i]=i;
for (i=;i<=tope && e[i].d<=m;i++)
{
comb(e[i].x,e[i].y);
}
int ans2=;
for (i=;i<n;i++)
{
is_root[get_fa(i)]=;
uf_size[uf[i]]++;
}
for (i=;i<n;i++)
is_root[i]+=is_root[i-];
for (i=;i<n;i++)
ans2=max(ans2,uf_size[i]);
printf("%d %d\n",is_root[n-],ans2);
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 奶牛的邻居【切比雪夫距离+并查集+multiset】

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

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

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

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

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

  8. 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    [算法]并查集+平衡树+数学+扫描线 [题解] 经典曼哈顿距离转切比雪夫距离. 曼哈顿距离:S=|x1-x2|+|y1-y2|<=c 即:max(x1-x2+y1-y2,x1-x2-y1+y2, ...

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

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

随机推荐

  1. Android_RadioButton,CheckBox

    xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...

  2. 破解C#的readonly只读字段

    破解C#的readonly只读字段 目录 请允许我再唠叨几句const和readonly 修改readonly字段: 计策1:反间计 -- 反射修改 计策2:借刀杀人--调节字段偏移位置的结构体来修改 ...

  3. javascript的一点误解

    var a=[]; for(var i = 0; i < 10; i++) { a[i] = function() { return i; } } console.log(a[9]()); co ...

  4. 多版本uboot命令行分析

    1.1.6 经典版本: 1.uboot第二阶段第一个函数void start_armboot (void),一路gd参数设置.设备初始化.控制台初始化.端口初始化,最后到main_loop ()命令行 ...

  5. Java反序列化

    一.序列化和反序列化的概念       把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬 ...

  6. 不需要软件让Windows7变身WIFI热点

    很简单,就是把一台装有windows 7操作系统,并配有无线网卡的电脑变成一台无线路由器或无线AP,以便在没有路由器的环境中实现多台无线终端(比如支持wifi的手机.电脑等设备)共享无线网络.那么我们 ...

  7. maven是什么?(转自oracle官网)

    Maven 是一个项目管理和构建自动化工具.但是对于我们程序员来说,我们最关心的是它的项目构建功能.所以这里我们介绍的就是怎样用 maven 来满足我们项目的日常需要.Maven 使用惯例优于配置的原 ...

  8. C#微信公众号开发 -- (六)自定义菜单事件之CLICK

    微信公众号中当用户手动点击了按钮,微信公众号会被动的向用户发送文字消息或者图文消息. 通过C#微信公众号开发 -- (五)自定义菜单创建 我们知道了如何将CLICK类型的按钮添加到自己的微信公众平台上 ...

  9. 什么情况下会调用到session_destroy()

    https://segmentfault.com/q/1010000000191102 首先 ... session_destory() 是一个函数 ... 这个函数在任何情况下都不会被 php 引擎 ...

  10. jsp 页面实现增减行

    1.页面加入 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> < ...