BZOJ1604 & 洛谷2906:[USACO2008 OPEN]Cow Neighborhoods 奶牛的邻居——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1604
https://www.luogu.org/problemnew/show/P2906#sub
了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的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均同属一个群.
给出奶牛们的位置,请计算草原上有多少个牛群,以及最大的牛群里有多少奶牛
参考题解:https://www.cnblogs.com/lidaxin/p/5192127.html
同时因为懒得写splay且set比较清真所以还看了:https://www.cnblogs.com/ChinaHook/p/6985444.html
(是的在之前我不会用set……)
首先看到曼哈顿距离立刻想到我们可以将其分成四种情况讨论(我们碰到过这样的题,比如天使玩偶)
那么我们经过漫长的讨论之后我们可以得到上面判别式的变体:max( |(Xi+Yi)-(Xj+Yj)|, |(Xi-Yi)-(Xj-Yj)| )<=c。
我们考虑将点坐标(x,y)变为(x+y,x-y),将max展开得到:
两点为同群满足第一条条件时,当且仅当①|Xi-Xj|<=c且②|Yi-Yj|<=c。
那么我们对X排序(这样单调后O(n)判断①,平衡树中不满足①的点删除即可),用平衡树维护Y的大小关系(lower_bound找到它左右的点与它判断②,其他点显然不用考虑因为如果某点与它为同群则必然与它左/右点同群),满足的点并查集一下即可。
PS:建立一个头和尾防止访问越界,由此可能引发爆int的问题,所以要么判别式移项要么开longlong
- #include<set>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int N=;
- const int INF=2e9+;
- inline int read(){
- int X=,w=;char ch=;
- while(ch<''||ch>''){if(ch=='-')w=-;ch=getchar();}
- while(ch>=''&&ch<='')X=(X<<)+(X<<)+ch-'',ch=getchar();
- return X*w;
- }
- struct point{
- int x,y;
- bool operator < (const point& a)const{
- return x<a.x||(x==a.x&&y<a.y);
- }
- }p[N];
- multiset<point>s;
- multiset<point> ::iterator it;
- int fa[N],sz[N],n,c;
- inline int find(int x){
- return (fa[x]==x)?x:fa[x]=find(fa[x]);
- }
- inline void unionn(int a,int b){
- if(a!=b){fa[a]=b;sz[b]+=sz[a];}
- }
- int main(){
- n=read(),c=read();
- for(int i=;i<=n;i++){
- int x=read(),y=read();
- p[i].x=x+y,p[i].y=x-y,fa[i]=i,sz[i]=;
- }
- sort(p+,p+n+);
- s.insert((point){INF,}),s.insert((point){-INF,});
- int front=;
- for(int i=;i<=n;i++){
- while(p[i].x-c>p[front].x){
- s.erase(s.lower_bound((point){p[front].y,front}));
- front++;
- }
- it=s.lower_bound((point){p[i].y,i});
- point r=*it,l=*(--it);
- if(r.x-c<=p[i].y)unionn(find(r.y),find(i));
- if(p[i].y-c<=l.x)unionn(find(l.y),find(i));
- s.insert((point){p[i].y,i});
- }
- int ans=,maxn=;
- for(int i=;i<=n;i++){
- if(fa[i]==i){
- ans++;
- maxn=max(maxn,sz[i]);
- }
- }
- printf("%d %d\n",ans,maxn);
- return ;
- }
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ1604 & 洛谷2906:[USACO2008 OPEN]Cow Neighborhoods 奶牛的邻居——题解的更多相关文章
- [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) ...
- BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
题目 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 Sec Memory Limit: 64 MB Description ...
- [BZOJ1604] [Usaco2008 Open] Cow Neighborhoods 奶牛的邻居 (queue & set)
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...
- bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...
- 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1604 这题太神了... 简直就是 神思想+神做法+神stl.. 被stl整的我想cry...首先,, ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...
- 【bzoj1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 旋转坐标系+并查集+Treap/STL-set
题目描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤ ...
- [BZOJ1604] [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(好题)
传送门 良心题解 #include <set> #include <cstdio> #include <iostream> #include <algorit ...
随机推荐
- 代码混淆防止APP被反编译指南
本文来自网易云社区 安卓App安全包含很多内容,包括混淆代码.整体Dex加固.拆分 Dex 加固.虚拟机加固等方面.事实上,这些内容也是国内近几年Android App安全保护的一种主要趋势. 混淆代 ...
- wireshark抓包分析——TCP/IP协议
本文来自网易云社区 当我们需要跟踪网络有关的信息时,经常会说"抓包".这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通 ...
- explain获得使用的key的数据
bool Explain_join::explain_key_and_len() { if (tab->ref.key_parts) return explain_key_and_len_ind ...
- .net MVC 图片水印,半透明
filter:alpha(opacity=50):这个是为IE6设的,可取值在0-100,其它三个0到1.-moz-opacity:0.5; 这个是为了支持一些老版本的Mozilla浏览器.-khtm ...
- 腾讯云ubuntu安装使用MySQL
安装步骤 ubuntu@VM---ubuntu:~$ sudo apt-get install mysql-server (密码: root/root) ubuntu@VM---ubuntu:~$ s ...
- Python基础 之 文件操作
文件操作 一.路径 文件绝对路径:d:\python.txt 文件相对路径:在IDEA左边的文件夹中 二.编码方式 utf-8 gbk... 三.操作方式 1.只读 r 和 rb 绝对路径的打开操作 ...
- scatter注记词
say illness thumb ginger brass atom twenty omit fine thought staff poverty
- Spring 3整合Quartz 2实现定时任务:动态添加任务
先展示一下后台管理定时任务效果图: 1.新增任务页面: 2.列表页(实现任务的禁用启用) 3.数据库脚本: -- ------------------------------ Table struct ...
- 2018-9-25kanboard安装及使用
2018-9-25kanboard安装及使用 教程 小书匠 欢迎走进zozo的学习之旅. 简介 运行官方docker容器 使用kanboard 简介 Kanboard的安装提供了两种方式一种是直接安 ...
- 在JS中 实现不用中间变量temp 实现两个变量值得交换
1.使用加减法; var a=1; var b=2; a=a+b; b=a-b; a=a-b; 2.使用乘除法(乘除法更像是加减法向乘除运算的映射) var a=1; var b=2; a = a * ...