bzoj1604 / P2906 [USACO08OPEN]牛的街区Cow Neighborhoods
P2906 [USACO08OPEN]牛的街区Cow Neighborhoods
考虑维护曼哈顿距离:$\left | x_{1}-x_{2} \right |+\left | y_{1}-y_{2} \right |$
看起来很难维护的样子,我们尝试转化
设两个点$(x_{1},y_{1}),(x_{2},y_{2}) (x_{1}>=x_{2})$
那么它们的曼哈顿距离有2种情况
1.$y_{1}>y_{2}:\left | x_{1}-x_{2} \right |+\left | y_{1}-y_{2} \right |=x_{1}-x_{2}+y_{1}-y_{2}=(x_{1}+y_{1})-(x_{2}+y_{2})$
2.$y_{1}<y_{2}:\left | x_{1}-x_{2} \right |+\left | y_{1}-y_{2} \right |=x_{1}-x_{2}-y_{1}+y_{2}=(x_{1}-y_{1})-(x_{2}-y_{2})$
于是我们就可以转为维护$(X=x+y,Y=x-y)$
这样曼哈顿距离就愉快地转化为$max(X_{1}-X_{2},Y_{1}-Y_{2})$了
我们先把所有坐标按$x$升序排一遍。
蓝后$x$坐标用一个队列维护
$y$坐标则用$multiset$维护(当然你愿意的话也可以打个平衡树(逃))
每次在$multiset$里搞搞啥$lower\_bound$操作就行了。
至于点的联通问题,搞一个并查集
end.
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#define re register
using namespace std;
typedef long long ll;
void read(ll &x){
char c=getchar();x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
}
int max(int &a,int &b){return a>b?a:b;}
#define N 100002
struct data{
ll x,y;int id;
data(){}
data(ll A,ll B,int C):
x(A),y(B),id(C)
{}
bool operator < (const data &tmp) const{return y<tmp.y;}
}a[N];
bool cmp(const data &A,const data &B){return A.x<B.x;}
multiset <data> s;
int n,t,mxd=-1e9,fa[N],siz[N]; ll c;
int found(int x){return fa[x]==x?x:fa[x]=found(fa[x]);}
void uni(int x,int y){
int r1=found(x),r2=found(y);
if(r1!=r2){
siz[r1]+=siz[r2]; --t;
siz[r2]=; fa[r2]=r1;
}
}
int main(){
scanf("%d",&n); read(c); t=n; ll q1,q2;
for(re int i=;i<=n;++i){
read(q1); read(q2);
fa[i]=i; siz[i]=;
a[i]=data(q1+q2,q1-q2,i);
}sort(a+,a+n+,cmp);
s.insert(data(,1e16,));
s.insert(data(,-1e16,));//添加边界防止指针越界
s.insert(a[]); int hd=;
multiset<data>::iterator it;
for(re int i=;i<=n;++i){
while(a[hd].x+c<a[i].x) s.erase(s.find(a[hd++]));//队列维护
it=s.lower_bound(a[i]);//找到第一个>=a[i].y的
if((*it).y-a[i].y<=c) uni((*it).id,a[i].id);
if(a[i].y-(*(--it)).y<=c) uni((*it).id,a[i].id);
s.insert(a[i]);
}printf("%d ",t);
for(re int i=;i<=n;++i) mxd=max(mxd,siz[i]);
printf("%d",mxd);
return ;
}
bzoj1604 / P2906 [USACO08OPEN]牛的街区Cow Neighborhoods的更多相关文章
- 洛谷 P2906 [USACO08OPEN]牛的街区Cow Neighborhoods | Set+并查集
题目: https://www.luogu.org/problemnew/show/P2906 题解: 垃圾水题 #include<cstdio> #include<algorith ...
- P2906 [USACO08OPEN]牛的街区Cow Neighborhoods
传送门 曼哈顿距离好像不好直接算,我们可以把牛的坐标转化一下以方便计算距离 (x,y) --> (x+y,x-y) 那么距离就可以表示成 $max(\left |x_1-x_2 \right ...
- 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告
P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ...
- [USACO08OPEN]牛的街区Cow Neighborhoods
题目描述: luogu 题解: 技巧题. 曼哈顿距离:$|x1-x2|+|y1-y2|$ 切比雪夫距离:$\max(|x1-x2|,|y1-y2|)$ 曼哈顿距离转切比雪夫距离:$(x,y)-> ...
- bzoj1623 / P2909 [USACO08OPEN]牛的车Cow Cars
P2909 [USACO08OPEN]牛的车Cow Cars 显然的贪心. 按速度从小到大排序.然后找车最少的车道,查询是否能填充进去. #include<iostream> #inclu ...
- 洛谷 P2909 [USACO08OPEN]牛的车Cow Cars
传送门 题目大意: m个车道. 如果第i头牛前面有k头牛,那么这头牛的最大速度会 变为原本的速度-k*D,如果速度小于l这头牛就不能行驶. 题解:贪心 让初始速度小的牛在前面 代码: #include ...
- [USACO08OPEN]牛的车Cow Cars
题目描述 N (1 <= N <= 50,000) cows conveniently numbered 1..N are driving in separate cars along a ...
- [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
[BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...
- 【BZOJ1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap+并查集
[BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000) ...
随机推荐
- C++的virtual详解
类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持面向对象的,其实不然,Visual BA ...
- JSP自定义标签rtexprvalue属性
rtexprvalue的全称是 Run-time Expression Value, 它用于表示是否可以使用JSP表达式.(比如EL表达式或OGNL表达式). 当在<attribute>标 ...
- JS-在线运行代码小工具
原理:window.open()方法,open一个新的空白页,然后把文本框中粘贴的代码通过DOM操作,写到新的代码页中, 再利用document.write的功能(写进去之前把其他的全部删掉,并且写进 ...
- LeetCode - Delete Duplicate Emails
Discription:Write a SQL query to delete all duplicate email entries in a table named Person, keeping ...
- 使用log4net记录日志到数据库(含有自定义属性)
记录日志是管理系统中对用户行为的一种监控与审核,asp.net中记录日志的方式有很多种,这里我只介绍一下最近用到的log4net,关于他的具体介绍网上有很多,我讲一下他的用法. 第一步:在配置文件中的 ...
- ELK平台介绍
在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段: 以下内容来自:http://baidu.blog.51cto.com/71938/1676798 日志主要包括系统日志.应用程序日志和安全 ...
- Android屏幕适配和文字屏幕适配
http://blog.sina.com.cn/s/blog_9996c67e0101euwd.html 最近在一个项目中要实现屏幕适配平板和手机等不同的型号,而蛋疼的美工给了一套图,而且这些图纸有在 ...
- 微信小程序 --- 获取当前坐标
获取位置:get.location type:wgs84(是全球定位系统,获取的坐标,gcj02是国家测绘局给出的坐标) btnclick:function(){ wx.getLocation({ t ...
- 移动端开发--rem和像素如何使用!
刚开始做移动端的开发的时候,大多时候是在使用 像素(PX)来写页面和布局的,但是使用下来,还是有多少不好用! 随之就开始用 rem 来写,rem写的结果是页面放到一些屏幕上,字体过小,如果页面渲染用了 ...
- python的tqdm模块
Tqdm 是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator). 根据要求安装依赖即可. 可以很方便的在 ...