BZOJ 2716/2648 SJY摆棋子

喷雾破碎模型解析:从理论到CFD应用实践 本文深入解析喷雾破碎模型的理论基础与CFD应用实践,重点介绍KHRT、TAB和ETAB等主流模型的核心原理与工程调参技巧。通过OpenFOAM实例演示和参数优化建议,帮助工程师精准预测液滴破碎行为,提升燃烧效率与排放控制性能,适用于汽车发动机、燃气轮机等工业场景。 阅读详情

Description

  这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格子可能有多个棋子。

Input

  第一行两个整数N和M;
  接下来N行,每行为一个点的坐标;
  接下来M行,每行3个数t,x,y;
  如果t=1,那么放下一个黑色棋子;
  如果t=2,那么放下一个白色棋子;

Output

  对于每个T=2 输出一个最小距离

Sample Input

2 3 1 1 2 3 2 1 2 1 3 3 2 4 2

Sample Output

1 2

这天,我闲的无聊。来做kd-tree的题。

kd-tree一般用来解决二维问题,当然高维也可以,时间复杂度O(玄学)O(n^((k-1)/k))

主要可用来解决两类问题:

1、最近邻点的查找(或精确查找) ——此题要求的是这个

2、范围查找(统计平面(多维空间)内的权值和等)。

结构定义如下:

struct Node{
	int p[k];//维数 
	int s[k];//儿子 
	int l[k],r[k];//范围 
	bool operator<(const Node&A)const{
		return p[nowst]<A.p[nowst];//nowst为全局变量 
	}
};

是的,不看p[],像线段树;不看l[],r[],像平衡树。个人倾向于像线段树,不过kd-tree每个节点都有其实际意义。

1、考虑建树过程:

对于一维,我们考虑BST,针对多维的时候,我们按层BST,比如k=3(p数组为坐标)

第一层:按p[0]排序,分成左右区间

第二层:按p[1]排序,分成左右区间

第三层:按p[2]排序,分成左右区间

第四层:按p[0]排序……

直到叶子结点。

画图发现,我们通过坐标点将坐标系分成了一个个举行(二维下)。

2、考虑查询:

考虑暴力查找,有个显然的最优性剪枝是先找离它近的,我们的kd-tree也是这样= =

那么能够感受出kd-tree十分玄学,本质上竟然是个暴力剪枝,想卡是很容易的。比如查询最近点,我们是通过判左右儿子的距离来定优先遍历顺序的,试想所有点等距离分布在一个圆上,圆心还有一个点。。。那么你将会把所有点遍历一遍= =|||

(貌似没有什么破的方法,因此能不写尽量就不写kd-tree吧)

3、考虑插入:

暴力插入,类似于平衡树的插入,不过每次判断要根据当前层的划分依据判断。

是的,显然要考虑重构问题,我们设一个阈值,每次达到之后暴力重构用替罪羊重构,时间复杂度是可以接受的。(然而这道题重构了并没有什么加速)

if(kd.cnt==sz){
  for(int i=1;i<=sz;++i)a[i]=kd.T[i];
  kd.rebuild(kd.root,1,sz,0);sz+=10000;
}

4、考虑删除(此题不用)

kd-tree的删除题目十分少,而且删除一次是O(n)的,因此不多讲2333(我也不会)

 

#include<bits/stdc++.h>
using namespace std;
const int Maxn=1000005;
int n,m,nowst;
struct KD_Tree{
	int cnt,root;
	struct Node{
		int p[2];//维数 
		int s[2];//儿子 
		int l[2],r[2];//范围 
		bool operator<(const Node&A)const{
			return p[nowst]<A.p[nowst];
		}
		void newnode(int *_p,int k){
			for(int i=0;i<k;++i){l[i]=r[i]=p[i]=_p[i];s[i]=0;}
		}
	}a[Maxn],nd;
	void maintain(int x,int k){
		for(int i=0;i<2;++i)if(a[x].s[i]){
			for(int j=0;j<k;++j)//维护管辖范围 
				a[x].l[j]=min(a[x].l[j],a[a[x].s[i]].l[j]),
				a[x].r[j]=max(a[x].r[j],a[a[x].s[i]].r[j]);
		}
	}
	void Build(int &x,int k,int l,int r,int state){
		if(l>r)return ;
		x=l+r>>1;
		nowst=state;
		nth_element(a+l,a+x,a+r+1);
		//系统函数,左闭中闭右开,将第x大放到中间,左边比他小(无序),右边比他小(无序),复杂度O(n)?不太了解,貌似要快一些 
		nd=a[x];a[x].newnode(nd.p,k);
		Build(a[x].s[0],k,l,x-1,state^1);
		Build(a[x].s[1],k,x+1,r,state^1);
		maintain(x,k);
	}
	bool check(Node A,Node B,int k){
		for(int i=0;i<k;++i)
			if(A.p[i]!=B.p[i])return 0;
		return 1;
	}
	inline void insert(int &x,int k,int state){
		if(!x)return a[x=++cnt].newnode(nd.p,k),void();
		if(check(nd,a[x],k))return ;//对于重复节点,自行维护 
		if(nd.p[state]<a[x].p[state])insert(a[x].s[0],k,state^1);
		else insert(a[x].s[1],k,state^1);
		maintain(x,k);
	}
	int dist(Node x,Node y){//如果包含则为0 ,不包含则是极限最近距离 
		return max(0,x.p[0]-y.r[0])+max(0,y.l[0]-x.p[0])+max(0,x.p[1]-y.r[1])+max(0,y.l[1]-x.p[1]);
	}
	void query(int x,int &ret){
		ret=min(ret,abs(a[x].p[0]-nd.p[0])+abs(a[x].p[1]-nd.p[1]));
		int dl=a[x].s[0]?dist(nd,a[a[x].s[0]]):0x3f3f3f3f;
		int dr=a[x].s[1]?dist(nd,a[a[x].s[1]]):0x3f3f3f3f;
		if(dl<dr){//是的,最优性剪枝 
			if(dl<ret)query(a[x].s[0],ret);
			if(dr<ret)query(a[x].s[1],ret);
		}else {
			if(dr<ret)query(a[x].s[1],ret);
			if(dl<ret)query(a[x].s[0],ret);
		}
	}
}kd;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		for(int j=0;j<2;++j)scanf("%d",&kd.nd.p[j]);
		kd.a[++kd.cnt]=kd.nd;
	}
	kd.Build(kd.root,2,1,kd.cnt,0);
	for(int i=1;i<=m;++i){
		int c;scanf("%d",&c);
		for(int j=0;j<2;++j)scanf("%d",&kd.nd.p[j]);
		if(c==1)kd.insert(kd.root,2,0);
		else {
			int Ans=0x3f3f3f3f;
			kd.query(kd.root,Ans);
			cout<<Ans<<'\n';
		}
	}
	return 0;
}

 

雷达工程师面试题目 详细描述项目背景、目标、你的具体职责和贡献,分析在项目实施过程中遇到的主要技术难题及解决方案,总结项目取得的成果和经验教训。 阅读详情

相关推荐

cst-python联合仿真的问题解决

cst与python联合仿真出现无法调用CST的问题解决

ayihu_的博客 2370

bzoj2648 SJY摆棋子(不带修改的KDtree的学习)

Description 这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格

Coco_T的博客 749

技能伤害继承英雄属性【War3地图编辑器】

风暴之锤跟随山丘之王的力量增长

ArYe 2299

BZOJ2648 SJY摆棋子

Description 这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子...

dgoh41514的博客 328

攻克Windows平台3DGS复现:从环境配置到可视化实战全记录

本文详细记录了在Windows平台成功复现3D Gaussian Splatting(3DGS)的完整流程,涵盖从环境配置、依赖安装、数据准备到模型训练与可视化的全步骤。重点解决了Windows下CUDA版本匹配、Visual Studio编译及SIBR_viewers可视化工具部署等核心难题,为开发者提供了一份详实的避坑指南与实战手册。

weixin_28839699的博客 251

电蚊拍为什么能秒杀蚊子?深入解析两种四倍压整流电路设计差异

本文深入解析电蚊拍秒杀蚊子的核心原理——四倍压整流电路设计,对比对称式与级联式两种方案的性能差异。通过详细电路分析、实测数据对比和选型建议,揭示高压电路设计的关键技术要点,为电子爱好者和工程师提供实用参考。

rust6ferris的博客 749

bzoj2648/2716 SJY摆棋子

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2648 http://www.lydsy.com/JudgeOnline/problem.php?id=2716 【题解】 直接上kdtree 用查询的最近最远点的那种写法。 估价在上一篇博客。 还不知道过了吗真是傻逼还有人卡评测我日 重构的BLOCK选在最多点数的1/...

aklm45097的博客 710

OpenCASCADE(OCC)读取 STEP 模型文件并在MFC中显示

OpenCASCADE(OCC)读取 STEP 模型文件并在MFC中显示

weixin_61900468的博客 1万+

【BZOJ2716/2648】SJY摆棋子

Description这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格子可

wang_sj的博客 6479

阿波罗开发板硬件架构与STM32模块化设计详解

嵌入式开发板的模块化设计是提升硬件复用性、降低迭代成本的关键技术路径。其核心在于底板与核心板的电气解耦与功能分层,依托STM32系列MCU(如F429/F767)的丰富外设资源与引脚复用能力,实现信号完整性、电源域隔离与热管理的系统级协同。该架构显著支撑工业HMI、智能家居网关、便携医疗设备等典型场景,尤其在RGB LCD驱动、QSPI Flash内存映射、多协议通信(CAN/RS485/USB)及低功耗唤醒(WK_UP按键)等工程实践中展现出高可靠性与易调试性。本文围绕阿波罗开发板展开深度解析,覆盖最小系

weixin_42510201的博客 64

重回童年的经典系列☀️| 【坦克大战3D版】游戏制作+解析

带你重回童年的经典系列——坦克大战3D版制作,感兴趣的可以看看呀~

努力前行,总会成为自己心中的那道光 5万+

[BZOJ2716/2648][Violet 3]天使玩偶/SJY摆棋子[KDtree]

KDtree干这个复杂度是不对的,重构不一定有作用 解释一下的话,因为复杂度是跟size相关的,所以重构作用不大,KDtree在查询最近点对中的作用仅仅是剪枝,可以构造数据使得他遍历O(n)个节点 hack kdtree (上面这个是按照洛谷数据范围 n,m 3e5造的 int n, m, x, y, now, ans, op, cnt, d[2]; struct Node { int Min...

weixin_34358092的博客 5792

SPMI协议学习总结

SPMI(System Power Management Interface)是由MIPI(Mobile Industry Processor Interface)联盟定义的一种硬件接口标准,它主要用于移动设备中,连接SoC(System on Chip)处理器系统的集成电源控制器与一个或多个电源管理IC(PMIC),以实现精确的电源管理

歌颂苦难的行为是无耻的; 1079

bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建。 luogu有个点开了O2才过....... 1 #include<iostream> 2 #include<cstdio> 3 #include&...

dingqiongliang0363的博客 6766

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【BZOJ 2648/2716】SJY摆棋子

Description这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格子可

still_foolish的博客 1618

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

BZOJ 2648/2716 SJY摆棋子/[Violet 3]天使玩偶 kd tree

Description 这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N   Input 第一行两个数 N M 以后M行,每行3个数 t x y 如果t=1 那么放下一个

I'm Growing 1785

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[Bzoj2716/2648]天使玩偶/SJY摆棋子

题意:平面上有一些点,之后还会在平面上插入一些点,还会询问某一个点到平面中最近的点的距离 K−DtreeK−DtreeK-Dtree,最近的点像[SDOI2010]Hide[SDOI2010]Hide[SDOI2010]Hide andandand SeekSeekSeek这样求就好了 然后这题是带插入的,和平衡树一样,可能会被卡掉 然而K−DtreeK−DtreeK-Dtree又不能旋转,...

BeNoble_的博客 7368

[bzoj2648/2716]SJY摆棋子_KD-Tree

SJY摆旗子 bzoj-2648 题目大意:平面上有n个黑子。有m个操作,可以下一颗白子,查询与曼哈顿距离下最近黑子之间的曼哈顿距离,或者下一颗黑子。 注释:$1\le n,m\le 5\cdot 10^5$ 想法:KD-Tree维护近邻点对问题。 这类问题和那个定区域查询问题不一样,那个问题的查询是类似分治,而近邻点对这个其实就是启发式暴力.. 设一个估价函数,表示当前要查询的点到...

weixin_30813225的博客 560

[bzoj2648/2716]SJY摆棋子

平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000 用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...) #include<iostream> #include<cstdio> #include<algorithm> #define INF 2000000000 #defin...

weixin_30362801的博客 233

BZOJ 2648: SJY摆棋子/BZOJ 2716: [Violet 3]天使玩偶 kdtree

2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 4191  Solved: 1454 [Submit][Status][Discuss] Description 这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离

BlackJack 2291

【BZOJ 2716/2648】 [Violet 3]天使玩偶 SJY摆棋子

题目大意:给定平面上一堆点,支持插入点和查询一个点的最近点离它的曼哈顿距离。 题解:KD-Tree裸题,第一次写KD-Tree,总的来说这是一种玄学时间复杂度的东西,为什么叫KD-Tree呢,因为它可以支持K维平面上的查询,为了让每个区域尽可能的均衡,我们采用每次变更比较维度的方法,就比如说我们在一个二维平面上横着切一刀再竖着切一刀,让平面的每个区间尽可能的点数相同,然后每一个点代表的就是一个K维

LZJ209的博客 2674

BZOJ 2648/2716(SJY摆棋子-KD_Tree)[Template:KD_Tree]

2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1180  Solved: 391 [Submit][Status][Discuss] Description 这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这

nike0good |Oier&ACMer | 熟能生巧 1372

BZOJ 2648 SJY摆棋子 / 2716 Violet 3 天使玩偶 K-D树

题目大意:平面上有一些点,问一个点周围离它最近的点的曼哈顿距离是多少。支持动态加点。 思路:CDQ分治可以离线解决,但是SJY是卡CDQ的,天使玩偶可以过。毕竟K-D树的O(sqrt(n))的时间复杂度摆在那。 K-D树理解起来其实不难,有k个维度的时候,每一层按照一个维度排序,取出按照这个维度排序的中位数,当作这个块的根,然后将这个块分开。还有一个比较重要的东西就是估价函数,这个函数

(╯°口°)╯(┴—┴ 1979

BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)

Description 这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋...

weixin_33816300的博客 2115

BZOJ_2716_[Violet 3]天使玩偶&&BZOJ_2648_SJY摆棋子_KDTree

BZOJ_2716_[Violet 3]天使玩偶&&BZOJ_2648_SJY摆棋子_KDTree Description 这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。...

4051

BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶

BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限。。。 其实这两道是同一题。 附上2648的题面: Description 这天,SJY显得无聊。在家自己玩。 在一个棋盘上,有N个黑色棋子。 他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。 此处的距离是 曼哈...

weixin_30564901的博客 1854
上一篇: JLOI2015/BZOJ4003 城池攻占
下一篇: HDU4348 To the moon
DancingZ
博客等级 码龄9年 10粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值