Description

传送门

Solution

题目要求的是曼达顿距离,对于每个点(x,y),我们把它变为(x-y,x+y),就可以转换成求切比雪夫距离了。

证明如下:$max(\left | (x_{p}-y_{p})-(x_{q}-y_{q}) \right |,\left | (x_{p}+y_{p})-(x_{q}+y_{q}) \right |)=max(\left | x_{p}-x_{q}\pm(y_{p}-y_{q}) \right | )=\left | x_{p}-x_{q} \right |+\left | y_{p}-y_{q} \right |$

设点a,b距离为d。

针对每个点i,讨论y值比y[i]恰好小d,且x与x[i]的差比d小的点的个数(记为cnt[i])并把这些点放到并查集内。(记得判重)

交换x,y值再重复一次上述步骤。

最后就同一个联通块算一下cnt的和就ok。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
vector<pair<ll,int> >v;
int n,a,b,x,y;
ll d;
struct P{ll x,y,id;
friend bool operator <(P a,P b){return a.x==b.x?a.y<b.y:a.x<b.x;}}p[];
int dis(P a,P b){return abs(a.x-b.x)+abs(a.y-b.y);}
int fa[];ll sz[];
int find_f(int x){return fa[x]==x?x:fa[x]=find_f(fa[x]);}
int cnt[];
void solve(int now)
{
vector<pair<ll,int> >::iterator _last,it;
v.clear();
int pre=;bool _is=;
for (int i=;i<=n;i++)
{
if (p[i].x!=p[i-].x) v.clear(),_is=;
while (p[i].x-p[pre].x>d&&pre<=n) pre++;
while (p[i].x-p[pre].x==d&&pre<=n) v.push_back(make_pair(p[pre].y,p[pre].id)),++pre;
it=lower_bound(v.begin(),v.end(),make_pair(p[i].y-d+now,));
if (_is){_is=;_last=v.begin();}
_last=max(_last,it);
if (it==v.end()||it->first >p[i].y+d-now) continue;
for(;_last!=v.end()&&_last->first<=p[i].y+d-now;_last++)
{
x=find_f(_last->second);y=find_f(p[i].id);
if (x!=y) fa[x]=y;
}
cnt[p[i].id]+=(_last-it);
if (_last!=it) _last--;
}
}
int main()
{
scanf("%d%d%d",&n,&a,&b);
for (int i=;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
d=dis(p[a],p[b]);
for (int i=;i<=n;i++) {fa[i]=i;x=p[i].x;y=p[i].y;p[i].x=x-y;p[i].y=x+y;p[i].id=i;}
sort(p+,p+n+);
solve();
for (int i=;i<=n;i++) swap(p[i].x,p[i].y);
sort(p+,p+n+);
solve();
for (int i=;i<=n;i++) sz[find_f(i)]+=cnt[i];
cout<<sz[find_f(a)];
}

[arc065E]Manhattan Compass[曼哈顿距离和切比雪夫距离转换]的更多相关文章

  1. Bzoj 3170[Tjoi 2013]松鼠聚会 曼哈顿距离与切比雪夫距离

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1318  Solved: 664[Submit][Stat ...

  2. [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)

    [BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

  3. Hdu 4312-Meeting point-2——哈夫曼距离与切比雪夫距离

    题意 从 $n$ 个点中选择一点,使得其他点到其的切比雪夫距离最小($0 < n \leq 1e5$). 分析 定理:$(x_1, y_1)$ 与 $(x_2, y_2)$ 的曼哈顿距离等于 $ ...

  4. Hdu 4312-Meeting point-2 切比雪夫距离,曼哈顿距离,前缀和

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=4312 Meeting point-2 Time Limit: 2000/1000 MS (Java/Ot ...

  5. BZOJ 3170 松鼠聚会(切比雪夫距离转曼哈顿距离)

    题意 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. 思路 题目 ...

  6. BZOJ.3170.[TJOI2013]松鼠聚会(切比雪夫距离转曼哈顿距离)

    题目链接 将原坐标系每个点的坐标\((x,y)\)变为\((x+y,x-y)\),则原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离. 反过来,将原坐标系每个点的坐标\((x,y)\)变为\((\f ...

  7. HDU 4312 Meeting point-2(切比雪夫距离转曼哈顿距离)

    http://acm.hdu.edu.cn/showproblem.php?pid=4312 题意:在上一题的基础上,由四个方向改为了八个方向. 思路: 引用自http://blog.csdn.net ...

  8. bzoj 3170 Tjoi 2013 松鼠聚会 曼哈顿距离&&切比雪夫距离

    因为曼哈顿距离很好求,所以要把每个点的坐标转换一下. 转自:http://blog.csdn.net/slongle_amazing/article/details/50911504 题解 两个点的切 ...

  9. 曼哈顿距离、欧几里得距离、闵氏距离(p→∞为切比雪夫距离)

    曼哈顿距离: 是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和. 曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离, ...

随机推荐

  1. 「bzoj 4184: shallot」

    权限题 线段树分治加线性基 首先这个题要求删除线性基肯定是没法处理的 于是我们套上一个线段树分治 线段树分治就是一种能够避免删除的神仙操作 我们发现询问是对一个时间的单点询问,而每一个数存在的时间却是 ...

  2. 【[HEOI2016/TJOI2016]序列】

    压行真漂亮 首先这肯定是一个\(dp\)了 设\(dp_i\)表示\(i\)结尾的最长不下降子序列的长度 显然我们要找一个\(j\)来转移 也就是\(dp_i=max(dp_j+1)\) 那么什么样的 ...

  3. Hadoop学习之路(二十五)MapReduce的API使用(二)

    学生成绩---增强版 数据信息 computer,huangxiaoming,85,86,41,75,93,42,85 computer,xuzheng,54,52,86,91,42 computer ...

  4. Vue - 如何实现一个双向绑定

    JS - 如何实现一个类似 vue 的双向绑定 Github JS 实现代码 先来看一张图: 这张图我做个简要的描述: 首先创建一个实例对象,分别触发了 compile  解析指令 和 observe ...

  5. 4、Web Service-Jaxws(Eclipse版本)实现查看天气和手机归属地

    1.前提概要 免费的官网:http://www.webxml.com.cn/zh_cn/web_services.aspx 官网提供了各种免费的webservice 我们使用的是:http://ws. ...

  6. 20155203 2016-2017-4 《Java程序设计》第9周学习总结

    20155203 2016-2017-4 <Java程序设计>第9周学习总结 教材学习内容总结 课堂内容 两个类如果有公共的部分要放在父类中,多次复用.当我们用父类或接口去声明对象的引用生 ...

  7. MYSQL统计

    今天  select * from 表名 where to_days(时间字段名) = to_days(now());  昨天  SELECT * FROM 表名 WHERE TO_DAYS( NOW ...

  8. i2c子系统

    linux内核的I2C驱动框架总览(1)I2C驱动框架的主要目标是:让驱动开发者可以在内核中方便的添加自己的I2C设备的驱动程序,从而可以更容易的在linux下驱动自己的I2C接口硬件(2)源码中I2 ...

  9. 设置PL/SQL Developer 字符集

    本文转自:http://blog.itpub.net/26613085/viewspace-765429/ 适用于:客户端和服务端不一致的情况,或者客户端某个字段的值乱码

  10. JQuery弹出Dialog关闭方式close vs destroy

    $editDialog.iDialog('close')  $(this).dialog('close'); 等Close方法关闭Dialog时,Dialog并不是完全消失,只是隐藏起来.两个Dial ...