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 ;
}

bzoj1604 牛的邻居 STL的更多相关文章

  1. 【题解】P2161[SHOI2009]会场预约(set)

    [题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...

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

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

  3. 【BZOJ1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap+并查集

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

  4. 【bzoj1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 旋转坐标系+并查集+Treap/STL-set

    题目描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤ ...

  5. [BZOJ1604] [Usaco2008 Open] Cow Neighborhoods 奶牛的邻居 (queue & set)

    Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...

  6. 牛客网多校第3场C-shuffle card 平衡树或stl(rope)

    链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...

  7. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  8. 牛客小白D题(STL的迭代器)

    「只要我拉动绳线,你就得随之起舞.」          ——泰兹瑞        泰兹瑞来到卡拉德许之后,由于他精湛的神器制造技术,可谓是过的如鱼得水.这次,他为自己打造了一个编辑器,称为威穆(Vei ...

  9. 牛客训练二:处女座的签到题(STL+精度+三角形求面积公式)

    题目链接:传送门 知识点: (1)三个点,三角形求面积公式 (2)精度问题: double 15-16位(参考文章) float 6-7位 long long 约20位 int 约10位 unsign ...

随机推荐

  1. BZOJ 2301 莫比乌斯函数+分块

    思路: 同BZOJ1101 就是加个容斥 - http://blog.csdn.net/qq_31785871/article/details/54340241 //By SiriusRen #inc ...

  2. javascript对象的深度克隆

    在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是 ...

  3. HDU 1950 Bridging signals【最长上升序列】

    解题思路:题目给出的描述就是一种求最长上升子序列的方法 将该列数an与其按升序排好序后的an'求出最长公共子序列就是最长上升子序列 但是这道题用这种方法是会超时的,用滚动数组优化也超时, 下面是网上找 ...

  4. ZBrush软件特性之3D图层

    用过Photoshop的小伙伴都知道图层的概念,在Photoshop中可以创建许许多多的图层,在每一图层中又可以分别编辑图像信息.ZBrush®中的3D图层,也可以简单理解成Photoshop中的图层 ...

  5. n阶方阵,数字从1~n^2,顺时针增大

    运行结果如下图: 解题思路:可以将这个问题分解成x个外围正方形所围成的图形,外围的正方形又可以分为4个步骤,向右依次增大.向下依次增大.向左依次增大.向上依次增大.基本思路就是如此,最关键的就是什么时 ...

  6. 模拟post提交

    模拟post提交 function post(URL, PARAMS) { var temp = document.createElement("form"); temp.acti ...

  7. redis数据库服务器开启的三种方式

    redis的启动方式1.直接启动  进入redis根目录,执行命令:  #加上‘&’号使redis以后台程序方式运行 1 ./redis-server & 2.通过指定配置文件启动  ...

  8. NOIp模拟赛二十九

    又是受虐的一天呢~接下来四天都要打模拟赛QAQ 今日分数:0(100)+100+0=100 A题O(读入)结论题判断结果时没return 0被subtask卡成0分,喜提fstQAQ,B题DP,C题不 ...

  9. LibSVM-windows

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50112477 官方Web: https ...

  10. input range 模拟滑块

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...