[USACO Open08]牛的邻居Cow Neighborhoods解题报告

USACO题目中英文翻译 USACO题目中英文翻译,包含section1.3~1.5 2.1 立即下载

题目


分析

首先我们来搞一搞这个模型。

和一个点的曼哈顿距离<=C的区域大致长这样:



中间红点就是我们的奶牛君。

如果我们把坐标系转45°,换言之做变换:x'=x+y,y'=x-y,那么这个区域就会变成一个正方形,像这样:



其实就是条件|x1-x2|+|y1-y2|<=C换成了|x1'-x2'|<=C且|y1'-y2'|<=C。可以自行枚举x1,x2,y1,y2的大小关系验证。

把整个坐标系画出来,可能是这样:



如果某头牛在另外一头牛的正方形区域内,它们就相邻。

我们自然就有了一个naive的算法:枚举每两头牛,看它们是否相邻,若相邻就用并查集合并之。然而这个算法是O(N^2*并查集)的,并没有什么卵用……

那怎么办呢?

基础思路就是:我们只需要找离某头牛“最近的一圈”。



假设有一头牛A,其右上方区域内y坐标最小的是B。那么,A的右上方所有和A相邻的牛,一定在B的上方且与B相邻。换言之,A右上方所有和A相邻的牛,都可以由A开始的一条“y坐标最小相邻牛”的连续链到达。

所以我们只需要对每个点,找出其四个象限内y坐标最靠近它的点,并将它们的并查集合并即可。这可以用按y坐标从低到高扫描+线段树完成。只需要写一个象限的即可,其他的可以通过变换坐标做四次得到。

代码

<span style="font-size:14px;">#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long LL;
#define Nil NULL
const int SIZEN=100010;
const int INF=0x7fffffff/2;
class Point{
public:
	int x,y;
	int id;
};
void print(const Point &p){
	cout<<"("<<p.x<<" "<<p.y<<")";
}
bool operator < (const Point &a,const Point &b){
	if(a.y==b.y) return a.x<b.x;
	return a.y<b.y;
}
int N;
int C;
Point P[SIZEN];
class Node{
public:
	int l,r;
	Node *lc,*rc;
	int t;
	void push_up(void){
		if(lc!=Nil){
			t=P[rc->t]<P[lc->t]?lc->t:rc->t;
		}
	}
	void modify(int x,int g){//新加一个横坐标为x的g号点
		if(x>r||x<l) return;
		if(x==l&&x==r){
			if(P[t]<P[g]) t=g;
		}
		else{
			lc->modify(x,g);
			rc->modify(x,g);
			push_up();
		}
	}
	int query(int a,int b){
		if(a>r||b<l) return 0;
		if(l>=a&&r<=b) return t;
		int g1=lc->query(a,b),g2=rc->query(a,b);
		return P[g2]<P[g1]?g1:g2;
	}
};
Node *build(int a,int b){
	Node *p=new Node;
	p->l=a,p->r=b;
	if(a==b){
		p->lc=p->rc=Nil;
		p->t=0;
	}
	else{
		int mid=(a+b)/2;
		p->lc=build(a,mid);
		p->rc=build(mid+1,b);
		p->t=0;
	}
	return p;
}
int ufs[SIZEN]={0};
int size[SIZEN]={0};
int grand(int x){
	return !ufs[x]?x:ufs[x]=grand(ufs[x]);
}
void merge(int a,int b){
	int ga=grand(a),gb=grand(b);
	if(ga==gb) return;
	ufs[ga]=gb;
	size[gb]+=size[ga];
}
int X[SIZEN];
Point Q[SIZEN];
void make_nearest(void){
	P[0].x=P[0].y=-INF;
	int tot=0;
	for(int i=1;i<=N;i++) X[tot++]=P[i].x;
	sort(X,X+tot);
	tot=unique(X,X+tot)-X;
	Node *root=build(0,tot-1);
	memcpy(Q,P,sizeof(Q));
	sort(Q+1,Q+1+N);
	for(int i=1;i<=N;i++){
		int l=lower_bound(X,X+tot,Q[i].x-C)-X;
		int r=upper_bound(X,X+tot,Q[i].x)-X-1;
		int q=root->query(l,r);
		if(q&&abs(P[q].y-Q[i].y)<=C) merge(Q[i].id,q);
		root->modify(lower_bound(X,X+tot,Q[i].x)-X,Q[i].id);
	}
}
void work(void){
	for(int i=1;i<=N;i++) size[i]=1;
	for(int c1=-1;c1<=1;c1+=2){
		for(int c2=-1;c2<=1;c2+=2){
			for(int i=1;i<=N;i++){
				P[i].x*=c1;
				P[i].y*=c2;
			}
			make_nearest();
		}
	}
	int cnt=0,mx=0;
	for(int i=1;i<=N;i++){
		if(ufs[i]==0){
			cnt++;
			mx=max(mx,size[i]);
		}
	}
	printf("%d %d\n",cnt,mx);
}
void read(void){
	scanf("%d%d",&N,&C);
	LL x,y;
	for(int i=1;i<=N;i++){
		scanf("%d%d",&x,&y);
		P[i].x=x+y,P[i].y=x-y;
		P[i].id=i;
	}
}
int main(){
	freopen("nabor.in","r",stdin);
	freopen("nabor.out","w",stdout);
	read();
	work();
	return 0;
}
</span>

ps:我以前还左手CDQ右手单调队列……现在就只会扫描线+线段树了,药丸呐药丸
FPGA从入门到精通(2) - LUT LUT:(look up table) 查找表 今天我要讲的与FPGA CLB相关的第一节LUT。根据上一节课的课程大纲,讲CLB应该是讲SLICEL(SLICEM)。不过当我打开用户手册,看了一下SLICE的结构(图一),一眼望去,这是分分钟会劝退入门者。为了让读者更好的接受以及理解,所以我打算先讲清楚它里面的每一个基本单元(LUT, 进位链,MUX,寄存器,几乎所有的FPGA器件的SLICE都是这四大件组成,只是组合不太一样而已),然后再将他们联系在一起,和读者一步步推倒出SLICE的结构。 图1​ 阅读详情

相关推荐

dos攻击 --hping3

dos使用hping3攻击

qq_65880213的博客 2747

「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告

P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows group into 'Cow Neighborhoods'. They have observed Farmer John's N (1 <= N <= 100,000) cows (con...

weixin_34378922的博客 197

新能源车主必看:用高德API+充电站数据制作跨城出行充电规划工具(附完整代码)

本文为新能源车主提供了一份详细的跨城出行充电规划工具构建指南。通过整合高德地图API与充电站数据,手把手教你使用Python开发一个智能规划系统,可自动规划路线并推荐沿途充电站,有效缓解里程焦虑。文章包含完整代码、核心算法解析及可视化实现,帮助车主实现个性化、高效的出行规划。

tgb3456789的博客 899

TongWeb8安装后远程登录不了?别慌,教你两步搞定控制台密码和IP白名单

本文详细解析了TongWeb8安装后远程登录控制台的常见问题,重点介绍了如何通过修改控制台密码和配置IP白名单两步操作解决访问限制。文章深入探讨了TongWeb8的安全设计理念,并提供了命令行工具和配置文件两种解决方案,帮助运维人员高效管理企业级中间件。

dingqiongliang0363的博客 429

禾赛XT16 vs XT32激光雷达实测对比:选16线还是32线?看完这篇不纠结

本文深度评测禾赛XT16与XT32激光雷达的性能差异与应用选择。通过实测数据对比,分析16线与32线激光雷达在点云密度、动态场景适应性及与IMU协同工作等方面的表现,帮助用户根据自动驾驶、机器人等不同应用场景做出最优选型决策。

table的专栏 944

RK3588开发板实战:从零开始移植Ubuntu 24.04(讯为SDK版)

本文详细介绍了如何在RK3588开发板上从零开始移植Ubuntu 24.04系统(讯为SDK版),涵盖开发环境准备、SDK解析、根文件系统定制、驱动适配、系统集成与烧录等全流程。通过实战案例,帮助开发者快速掌握RK3588开发板的系统移植技巧,适用于嵌入式开发与定制化Linux系统构建。

sand8的博客 436

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

传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1604题目大意给定n个点的坐标和C,若两个点间的曼哈顿距离≤C,就连一条边,询问联通块个数和最大联通块大小给定n个点的坐标和C,若两个点间的曼哈顿距离\le C,就连一条边,询问联通块个数和最大联通块大小题解曼哈顿距离转切比雪夫:(x,y)=(x+y,x−y)(x,y)=(x+y,x-y) 切比

slongle的专栏 1024

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

题目 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit:5 SecMemory Limit:64 MB Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位...

weixin_30662849的博客 162

AUTOSAR从入门到精通-汽车电子电气架构(EEA)

EEA(Electrical/Electronic Architecture),电子电气架构,是首先由德尔福公司提出的,集合汽车的电子电气系统原理设计、中央电器盒的设计、连接器的设计、电子电气分配系统等设计为一体的整车电子电气解决方案的概念。通过EEA的设计,可将动力总成、驱动信息、娱乐信息等车身信息转化为实际的电源分配的物理布局、信号网络、数据网络、诊断、容错、能量管理等的电子电气解决方案。

getusushu的博客 858

数控系统(CNC)系列:Hurco VMX42SR_(11).加工准备流程

在开始使用Hurco VMX42SR进行加工之前,首先需要对机床进行初始设置。这包括机床的水平调整、电源连接和控制系统的基本配置。正确的初始设置是确保加工精度和机床安全运行的前提。

2401_87715305的博客 841

[USACO08OPEN]牛的街区Cow Neighborhoods

题目描述: luogu 题解: 技巧题。 曼哈顿距离:$|x1-x2|+|y1-y2|$ 切比雪夫距离:$\max(|x1-x2|,|y1-y2|)$ 曼哈顿距离转切比雪夫距离:$(x,y)->(x+y,x-y)$ 所以……排完序拿stl::set模拟就好了。 代码: #include<set> #include<cstdio> ...

a6t2007的博客 224

PCL点云算法与项目实战案例汇总(长期更新)

本专栏将深入探讨PCL(点云库)的基础算法,旨在帮助读者掌握点云处理的核心技术。内容涵盖点云的采样、过滤、配准、分割等基础操作,并结合实际案例,展示这些算法在工程中的应用。无论你是初学者还是有一定经验的开发者,都能通过本专栏加深对PCL的理解,提升在三维数据处理领域的技能。

纵马踏花向自由 3002

bzoj1604[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居*

bzoj1604[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 题意: n只牛,牛结成群当且仅当两只牛曼哈顿距离≤c或存在第三头牛使两头牛与它的曼哈顿距离都≤c,求最大的群和群数。n≤100000 题解: 好神啊。先把曼哈顿距离转成切比雪夫距离,(x,y)转为(x+y,x-y)。然后按x坐标排序,用两个指针维护使x坐标差值≤c,同时将新插入的y坐标...

anheku1562的博客 177

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

「BZOJ1604」[Usaco2008 Open] Cow Neighborhoods 奶牛的邻居

算法:曼哈顿距离转切比雪夫距离+并查集+平衡树 (这里的代码选择STL里的set实现平衡树) 储备知识 曼哈顿距离 在二维空间内,两个点之间的曼哈顿距离为它们横坐标之差的绝对值与纵坐标之差的绝对值之和。设点 A(x1,y1),B(x2,y2),则 A,B 之间的曼哈顿距离用公式可以表示为: dAB=|x1-x2|+|y1-y2| 通过公式,我们很容易得到 A,B两点间的曼哈顿距离: dAB=|6...

annazsy的博客 322

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

bzoj1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

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+I

Doleful Aria 568

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

【BZOJ1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤[1..10^9];Xi,Yi∈整数.当满足下列两个条件之一,两只奶...

aodanchui1057的博客 167

【bzoj 1604】: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 set+并查集

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=16041604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 783 Solved: 305 [Submit][Status][Discuss] Descri

ATOD 1045

[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 SecMemory Limit: 64 MB Submit: 1102Solved: 446 [Submit][Status][Discuss] Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会...

weixin_30359021的博客 137

BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap

题意:链接 方法: Treap 解析: 前几道资格赛的题水的不行,这道Gold的题就够分量辣。 首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发现这个玩意转化之后就变得有思路多了,所以这数学本领还是非常重要啊=-= 先看曼哈顿距离的定义 |x1−x2|+|y1−y2| 拆绝对值 ...

aodiyi6351的博客 148

BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

set+并查集+切比雪夫

sdfzrlt的博客 451

bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

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 -

Shion的专栏 574
上一篇: [USACO Jan07]考试Schul解题报告
下一篇: [USACO Nov08]玩具toys解题报告
wmdcstdio
博客等级 码龄12年 76粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值