Description

了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤[1..10^9];Xi,Yi∈整数.当满足下列两个条件之一,两只奶牛i和j是属于同一个群的:
  1.两只奶牛的曼哈顿距离不超过C(1≤C≤10^9),即lXi - xil+IYi - Yil≤C.
  2.两只奶牛有共同的邻居.即,存在一只奶牛k,使i与k,j与k均同属一个群.
    给出奶牛们的位置,请计算草原上有多少个牛群,以及最大的牛群里有多少奶牛
Input
第1行输入N和C,之后N行每行输入一只奶牛的坐标.
Output
仅一行,先输出牛群数,再输出最大牛群里的牛数,用空格隔开.
Sample Input
4 2
1 1
3 3
2 2
10 10
Sample Output
2 3
【题解】
本题需要求曼哈顿距离,并且在寻找邻居的时候只要找距离自己最近的奶牛看看与它是否属于同一个群。很容易想到使用平衡树求前驱和后继,但是求曼哈顿距离的公式|X1-X2|+|Y1-Y2|很难维护。
所以我们要对数据进行处理,讲每个点变为(x+y,x-y),这样曼哈顿距离就是max(|X1-X2|,|Y1-Y2|)。每次比较只要比较两个点的一个值就可以了。
所以我们用一个队列维护x,用一个平衡树(或者multiset)去维护y。找到合法的就用并查集将两个合在一起。
 #include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define ll long long
int f[maxn],tot[maxn];
int n,m,ans,mx;
ll c;
struct node{
ll x,y;int id;
}a[maxn];
inline int read(){
int x,f;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
multiset<node> b;
multiset<node>:: iterator it;
bool cmp(node a,node b){
return a.x<b.x;
}
bool operator<(node a,node b){return a.y<b.y;}
int find(int x){
if(f[x]!=x)return find(f[x]);
else return x;
}
void work(int x,int y){//将两个群合并在一起
int p=find(x),q=find(y);
if(p!=q){
tot[p]+=tot[q];tot[q]=;ans--;
f[q]=p;
}
}
void solve(){
node k;int i,he=;
sort(a+,a+n+,cmp);b.insert(a[]);
k.x=;k.y=1e10;k.id=;b.insert(k);
k.x=;k.y=-1e10;k.id=;b.insert(k);
for(i=;i<=n;i++){
while(a[i].x-a[he].x>c)b.erase(b.find(a[he])),++he;//判断x是否合法
it=b.lower_bound(a[i]);
k=*it;
if(k.y-a[i].y<=c)work(k.id,a[i].id);
k=*--it;
if(a[i].y-k.y<=c)work(k.id,a[i].id);
b.insert(a[i]);
}
}
int main(){
scanf("%d%d",&n,&c);
int kx,ky;
ans=n;//ans是群数,tot是每个群里牛的数量
for(int i=;i<=n;i++){
scanf("%d%d",&kx,&ky);
f[i]=i;tot[i]=;
a[i].x=kx+ky;
a[i].y=kx-ky;
a[i].id=i;
}
solve();
for(int i=;i<=n;i++)mx=max(tot[i],mx);
printf("%d %d",ans,mx);
return ;
}

最新文章

  1. mybatis——使用mapper代理开发方式
  2. elasticsearch 查询(match和term)
  3. 织梦DedeCms用SQL语句调用数据库任意内容方法
  4. 【转】Python中执行cmd的三种方式
  5. 基于CefGlue的桌面应用开发
  6. c#入门系列——基础篇
  7. [HAOI2011]Problem c
  8. BZOJ.5251.[八省联考2018]劈配mentor(最大流)
  9. 4.App非功能测试总结
  10. 使用.NET Core与Google Optimization Tools实现加工车间任务规划
  11. 小学四则运算APP 第一个冲刺阶段 第六天
  12. CentOS 端口映射
  13. css3自定义滚动条背景透明
  14. jquery的closest方法和parents方法的区别
  15. 原生js 操作dom
  16. js获取当前时间(昨天、今天、明天)
  17. 第十九次ScrumMeeting会议
  18. JMS之——ActiveMQ高可用+负载均衡集群
  19. XML数据库的尝试
  20. stark组件之创建

热门文章

  1. inline元素和inline-block元素的4px空白间距解决方案
  2. 我的Java历程_maven配置的心路历程
  3. Matlab 从入门到精通 Chapter11 文件读取I/O
  4. Unknown column &#39;t_user.id&#39; in &#39;where clause&#39;(通过字段名删除不了数据)
  5. 洛谷 P1462 通往奥格瑞玛的道路 二分 最短路
  6. 前端路由的两种模式:hash(#)模式和history模式(转)
  7. (WC2018模拟十二)【FJOI2016集训Day7T2】点对游戏
  8. HDU-5693 D Game 动态规划 两次动规
  9. 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)
  10. logstash-shipper.conf