传送门

乍一看像是一个计算几何,然后想到了BFS,但是苦于无奈\(O(n^2)\)不会优化

然后以下参考zjq_shadow大佬的思路

显然发现曼哈顿距离很麻烦,除了暴力枚举貌似没什么很好的办法

考虑将坐标轴旋转\(45^\circ\),然后就可以将曼哈顿距离转化为切比雪夫距离,坐标为\((x,y)\)的点坐标就变为\((x+y,x-y)\)

那么对于\(x1,y1\)要求的\(x2,y2\),需满足

\[|x1-x2|=dis\\
|y1-y2|<=dis
\]

或者

\[|y1-y2|=dis\\
|x1-x2|<=dis
\]

然后就可以排序,排序之后每个点对应的就是一段区间了

但是这样并不好统计答案,所以考虑转化一下问题

我们可以把满足条件的点对都连边,这样的话答案就是\(a\)和\(b\)所在的联通块的点的度数和

然后暴力连边复杂度依然爆炸

考虑到相邻的点对应的区间差别不大,去连重复的区间里的点显然没意义,所以记下一个上次连的最后一个点\(pos\),每次从\(pos\)开始连边就好了

有一个小细节:观察上面的两种情况,对于第一种情况,如果算了\(|y1-y2|=dis\),在第二种情况中再算\(|x1-x2|=dis\)是会重复计算的,所以要处理一下

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void read(int &x){
char ch;bool ok;
for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;
}
#define rg register
const int maxn=1e5+10;bool vis[maxn];
int n,a,b,len,sum[maxn],pre[maxn*10],nxt[maxn*10],h[maxn],cnt;
long long ans;
struct oo{int x,y,id;}s[maxn];
void add(int x,int y){
pre[++cnt]=y,nxt[cnt]=h[x],h[x]=cnt;
pre[++cnt]=x,nxt[cnt]=h[y],h[y]=cnt;
}
bool cmp(oo a,oo b){return a.x==b.x?(a.y<b.y):a.x<b.x;}
void solve(int dis){
sort(s+1,s+n+1,cmp);
int l=1,r=0,pos=1;
for(rg int i=1;i<=n;i++){
while(l<n&&(s[l].x<s[i].x-len||(s[l].x==s[i].x-len&&s[l].y<s[i].y-dis)))l++;
while(r<n&&(s[r+1].x<s[i].x-len||(s[r+1].x==s[i].x-len&&s[r+1].y<=s[i].y+dis)))r++;
sum[s[i].id]+=r-l+1;pos=max(pos,l);
while(pos<=r)add(s[i].id,s[pos].id),pos++;
pos--;
}
}
void dfs(int x){
vis[x]=1;ans+=sum[x];
for(rg int i=h[x];i;i=nxt[i])
if(!vis[pre[i]])dfs(pre[i]);
}
int main(){
read(n),read(a),read(b);
for(rg int i=1,x,y;i<=n;i++){
read(x),read(y),s[i].id=i;
s[i].x=x+y,s[i].y=x-y;
}
len=max(abs(s[a].x-s[b].x),abs(s[a].y-s[b].y));
solve(len);
for(rg int i=1;i<=n;i++)swap(s[i].x,s[i].y);
solve(len-1),dfs(a);
printf("%lld\n",ans);
}

AT2160 へんなコンパス / Manhattan Compass的更多相关文章

  1. [arc065E]Manhattan Compass[曼哈顿距离和切比雪夫距离转换]

    Description 传送门 Solution 题目要求的是曼达顿距离,对于每个点(x,y),我们把它变为(x-y,x+y),就可以转换成求切比雪夫距离了. 证明如下:$max(\left | (x ...

  2. Arc065_E Manhattan Compass

    平面上有$N$个点$(X_i\space, Y_i)$,定义$D(a,b)=|X_a-X_b|+|Y_a-Y_b|$. 如果你当前在$(p,q)$,这个无序二元组(即$(p,q)$和$(q,p)$被认 ...

  3. AtCoder 瞎做

    目录 ARC 058 E - 和風いろはちゃん / Iroha and Haiku 题意 题解 技巧 代码 ARC 059 F - バイナリハック / Unhappy Hacking 题意 题解 技巧 ...

  4. NOIp2018模拟赛三十八

    爆〇啦~ A题C题不会写,B题头铁写正解: 随手过拍很自信,出分一看挂成零. 若要问我为什么?gtmdsubtask! 神tm就一个subtask要么0分要么100,结果我预处理少了一点当场去世 难受 ...

  5. 【AtCoder】ARC065

    ARC065 C - 白昼夢 / Daydream 直接递推就好 #include <bits/stdc++.h> #define fi first #define se second # ...

  6. Sass之坑Compass编译报错

    前段时间在使用Compass时遇到了其为难处理的一个坑,现记录到博客希望能帮助到各位. 一.问题: 利用Koala或者是gulp编译提示如下,截图为koala编译提示错误: 二.解决办法 从问题截图上 ...

  7. compass reset和layout [Sass和compass学习笔记]

    reset 可以重置浏览器的的html的默认样式,因为各个浏览器对有些元素解析差别很大 通过重置样式可以让样式的浏览器兼容 更简单 使用方法简单 @import "compass/reset ...

  8. 分享15款很实用的 Sass 和 Compass 工具

    Sass 是 CSS 的扩展,增加了嵌套规则,变量,混入功能等很多更多.它简化了组织和维护 CSS 代码的成本.Compass 是一个开源的 CSS 框架,使得使用 CSS3 和流行的设计模式比以往任 ...

  9. SASS+COMPASS 自适应 学习笔记

    来源 http://snugug.github.io/RWD-with-Sass-Compass/#/ 1 安装 COMPASS 扩展 安装 方式 gem 'extension', '~>X.Y ...

随机推荐

  1. linux命令学习笔记(59):rcp命令

    rcp代表“remote file copy”(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝:第二种格式用于把文件或目录拷贝到另一个目录中. . ...

  2. BestCoder Round #93 比赛记录

    机房又迎来了一次BC.大家都沸腾了... BC开场,大家全都瞬间开始 啪啦啪啦啪啦啪啦 都要赶紧水过第一题. 第一题明显直接贪心就好了,用map去重. 本人荣幸地第一个写完,提交 Wa. (崩溃的内心 ...

  3. 使用UIVisualEffectView创建毛玻璃效果

    UIVisuaEffectView :继承自UIView,可以看成是专门用于处理毛玻璃效果的视图,只要我们将这个特殊的View添加到其他视图(eg. ImageView )上面,被该UIVisuaEf ...

  4. Bootstrap CSS教程

    Bootstrap 教程 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加 ...

  5. bzoj 1043 下落的圆盘 —— 求圆心角、圆周长

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 求出每个圆没被覆盖的长度即可: 特判包含和相离的情况,注意判包含时 i 包含 j 和 ...

  6. bzoj 3671 随机数生成器 —— 暴力

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 原来256M是可以开两个3e7的数组的: 因为答案只有 n+m-1 个数,所以暴力判断 ...

  7. C/C++文件读写操作总结

    本文主要从两方面介绍读写文件操作,一个是C,另一个是C++. 一.基于C的文件操作. 在ANSI C中对文件操作有两种方式,一种是流式文件操作,另一种是I/O文件操作.下面分别介绍. 1.流式文件操作 ...

  8. Java 的 Tuple 元组数据类型

    元组类型,即 Tuple 常在脚本语言中出现,例如 Scala 的 ("Unmi", "china@qq.com", "blahbla"). ...

  9. Lua虚拟机初始化

    转自:http://www.cnblogs.com/ringofthec/archive/2010/11/09/lua_State.html 1. 创建lua虚拟机 lua_State *lua_ne ...

  10. JAVAWeb SSH框架 利用POI 导出EXCEL,弹出保存框

    导入包这一些不多说,直接贴出关键代码,JSP只要点一个Action链接就行. poi包我是用:poi-3.11-20141221.jar 亲测有效: 效果: Action 类代码: private I ...