[BZOJ]2648 SJY摆棋子 KD-Tree

OpenMV模块视觉测距(避障)+颜色识别+TFT-LCD显示(实现原理与代码分析) 上图所示代码实际运行的帧率比较低,主要原因有以下两个:1.硬件问题,博主使用的版本比较低,可以尝试使用高版本OpenMV2.图像滤波问题。之前加入图像滤波是想提高色块识别的准确性,但是相应的运算速度也会下降。 阅读详情

2648: SJY摆棋子

Time Limit: 20 Sec   Memory Limit: 128 MB
Submit: 5049   Solved: 1762
[ Submit][ Status][ Discuss]

Description

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

Input

第一行两个数 N M
以后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

HINT

 

kdtree可以过

Source

[ Submit][ Status][ Discuss]


HOME Back

  写了崂山那道题之后做这道题就很轻松了. 就是求最近邻点. 那么每次查询对左右子树的下界进行估价来判断谁更优来剪枝查询. 这道题不用写替罪羊重构也能过. 一发AC嘿嘿嘿.

  有些人学了之后认为是剪枝后的暴力, 实际上可以证明这样最坏是n根号n. 因为假设查询一个矩形的信息的话复杂度直接考虑矩形边界跨过的区域带来的复杂度(因为被完全包含或者被完全不包含的子树肯定不会进入递归), 考虑矩形的一条边所跨过的. 从root进行查询每两次就会与这条边平行剪掉一般的枝条. 那么每两次剪一半, 树高又是log, 那么推一下式子就会发现是n根号n. 而查最近点对每次查询左右子树就相当于在框一个矩形. 同理可证k维每次查询复杂度是n^(1 - 1 / k).

  Upd: 突然发现查询曼哈顿距离不是在框矩形??? 那这道题复杂度岂不是玄学??? 不过是矩形查询的复杂度就是如上所说的n根号n啦... 所以这道题正解是什么???

#include<bits/stdc++.h>
#define Boc register char
#define Acce register int
using namespace std;
const int inf = 1 << 30;
const int maxn = 1e6 + 5;
int n, Q, cmpd, qx, qy, ans, opt, root, cur;
inline const int read() {
	Acce x = 0;
	Boc ch = getchar();
	while (ch < '0' || ch > '9') ch = getchar();
	while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
	return x;
}
struct KDT {
	int ls, rs;
	int mx[2], mn[2], d[2];
	inline friend bool operator < (const KDT &r, const KDT &s) {
		return r.d[cmpd] < s.d[cmpd];
	}
}t[maxn];
inline void update(int x) {
	if (t[x].ls) {
		t[x].mn[0] = min(t[x].mn[0], t[t[x].ls].mn[0]);
		t[x].mx[0] = max(t[x].mx[0], t[t[x].ls].mx[0]);
		t[x].mn[1] = min(t[x].mn[1], t[t[x].ls].mn[1]);
		t[x].mx[1] = max(t[x].mx[1], t[t[x].ls].mx[1]);
	}
	if (t[x].rs) {
		t[x].mn[0] = min(t[x].mn[0], t[t[x].rs].mn[0]);
		t[x].mx[0] = max(t[x].mx[0], t[t[x].rs].mx[0]);
		t[x].mn[1] = min(t[x].mn[1], t[t[x].rs].mn[1]);
		t[x].mx[1] = max(t[x].mx[1], t[t[x].rs].mx[1]);
	}
}
inline int dist(int x) {
	int tmp = 0;
	tmp += max(t[x].mn[0] - qx, 0) + max(qx - t[x].mx[0], 0);
	tmp += max(t[x].mn[1] - qy, 0) + max(qy - t[x].mx[1], 0);
	return tmp;
}
int build(int lf, int rg, int D) {
	int mid = (lf + rg) >> 1;
	cmpd = D;
	nth_element(t + lf + 1, t + mid + 1, t + rg + 1);
	t[mid].mn[0] = t[mid].mx[0] = t[mid].d[0];
	t[mid].mn[1] = t[mid].mx[1] = t[mid].d[1];
	(lf ^ mid) ? t[mid].ls = build(lf, mid - 1, !D) : t[mid].ls = 0;
	(rg ^ mid) ? t[mid].rs = build(mid + 1, rg, !D) : t[mid].rs = 0;
	update(mid);
	return mid;
}
inline void insert() {
	++ cur;
	t[cur].mn[0] = t[cur].mx[0] = t[cur].d[0] = qx;
	t[cur].mn[1] = t[cur].mx[1] = t[cur].d[1] = qy;
	int x = root, D = 0;
	while (true) {
		t[x].mn[0] = min(t[x].mn[0], t[cur].d[0]);
		t[x].mx[0] = max(t[x].mx[0], t[cur].d[0]);
		t[x].mn[1] = min(t[x].mn[1], t[cur].d[1]);
		t[x].mx[1] = max(t[x].mx[1], t[cur].d[1]);
		if (t[cur].d[D] < t[x].d[D]) {
			if (! t[x].ls) {
				t[x].ls = cur;
				break;
			} else x = t[x].ls;
		} else {
			if (! t[x].rs) {
				t[x].rs = cur;
				break;
			} else x = t[x].rs;
		}
		D = !D;
	}
}
void query(int x) {
	int dl, dr;
	ans = min(ans, abs(qx - t[x].d[0]) + abs(qy - t[x].d[1]));
	dl = (t[x].ls) ? dist(t[x].ls) : inf;
	dr = (t[x].rs) ? dist(t[x].rs) : inf;
	if (dl < dr) {
		if (dl < ans) query(t[x].ls);
		if (dr < ans) query(t[x].rs);
	} else {
		if (dr < ans) query(t[x].rs);
		if (dl < ans) query(t[x].ls);
	}
}
int main() {
	n = read(), Q = read();
	for (Acce i = 1; i <= n; ++ i) t[i].d[0] = read(), t[i].d[1] = read();
	root = build(1, n, 0), cur = n;
	for (Acce i = 1; i <= Q; ++ i) {
		opt = read();
		qx = read(), qy = read();
		if (opt & 1) insert();
		else ans = inf, query(root), printf("%d\n", ans);
	}
}


PCL 读取和保存点云 PCL (Point Cloud Library) 是一个用于处理 3D 点云数据的开源库。在处理点云数据时,常见的任务包括点云的读写和可视化。PCL 提供了强大的 IO 模块来读取和写入各种格式的点云文件,并且提供了可视化模块来对点云进行渲染和显示。点云的读写与显示是很多 3D 数据处理任务的基础步骤,通过这些步骤,可以对点云进行预处理、分析和操作。 阅读详情

相关推荐

保姆级教程:用Verilog手把手实现一个MIPI CSI-2 D-PHY接收器(附PPI接口时序详解)

本文提供了一份详细的Verilog实现MIPI CSI-2 D-PHY接收器的教程,重点解析了PPI接口时序和deskew数据对齐技术。通过模块划分、时钟域处理、状态机设计和错误恢复机制等实战内容,帮助开发者掌握高速数据接收的核心技术,适用于嵌入式视觉系统开发。

weixin_30619101的博客 512

BZOJ2648 - SJY摆棋子

k-d树裸题

VisJiao的博客 586

华大HC32F460 TCP Client 实验

华大HC32F460 TCP Client 实验

ZhuoWuKeJi的博客 647

【BZOJ2648】SJY摆棋子(KD-Tree)

点此看题面 大致题意: 在一个二维平面上现有NNN个棋子,有两种操作:增加一个棋子;查询离某个坐标最近的棋子离它的曼哈顿距离。 KD−TreeKD-TreeKD−Tree 这是一道KD−TreeKD-TreeKD−Tree的乱搞题。 LinkLinkLink KD−TreeKD-TreeKD−Tree 详见博客 浅谈KD-Tree 如何询问 在此题中,建树、插入、重构等过程其实与普通的KD...

CXR的博客 335

别再让CPU干GPU的活了:CST Studio Suite GPU加速深度调优指南(从驱动版本到任务管理器监控)

本文深入探讨了CST Studio Suite的GPU加速深度调优方法,从NVIDIA驱动版本选择到系统级资源管理,再到实时监控与瓶颈诊断技术。通过科学的驱动优化、GPU资源管理策略和高级调优技巧,显著提升仿真效率,特别适合电磁仿真工程师和硬件加速需求的专业用户。

weixin_28740299的博客 163

ZYNQ Linux环境下PS端I2C驱动OV5640摄像头全流程解析

本文详细解析了在ZYNQ Linux环境下,通过PS端I2C驱动OV5640摄像头的完整流程。内容涵盖从Vivado硬件配置、PetaLinux系统构建、设备树节点添加,到用户空间I2C编程与寄存器配置实战,并提供了关键的调试技巧与常见问题排查方法,帮助开发者快速实现嵌入式视觉应用的传感器配置。

vulkan6gpu的博客 853

bzoj 2468 kdtree

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

MY Blog 760

【Lammps】MS将cif通过msi2lmp.exe转为data文件

在Materials Studio中打开cif文件,在Modules工具行选择Forcite>calculation>Energy中选用cvff力场,点击more,不要运行run,在more中取消勾选calculate automatically,点击calculate,然后叉掉后在file>export导出car文件,同步生成了mdf文件。对于MS中没有的立场,选择之后点calculate会报错,右键选择label,然后根据Forcite选择原子,会发现有力场的有标号,没有力场的MS没有对选择标号。

zhangguoliang624的博客 3673

2648: SJY摆棋子

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

CRZbulabula的博客 847

HyperMesh实战:用Field工具搞定复杂载荷映射(附TCL脚本示例)

本文深入探讨了HyperMesh中Field工具在复杂载荷映射中的高级应用,包括从CSV到有限元网格的温度场映射全流程、稀疏数据处理技巧及TCL自动化脚本示例。通过Field工具,工程师可以高效实现CFD温度场到结构网格的精准映射,显著提升有限元分析的精度与效率。

white的博客 265

一篇关于轴承故障诊断的综述

在设备的故障检测中,有约30%-40%的设备故障是由轴承故障引起的,因此本文将列举有关检测轴承故障使用到的相关数据集,模型和算法。 数据集 现有的数据集,普遍由固定在电机马达上的两个震动检测器获得,并根据需要,分离震动数据在时域和频域上的特征以供网络模型学习。 不同的数据集,区别在于,检测的马达转速不同,环境不同,取样频率不同,一段样本的时长不同等等 (1)Case Western Reserve University (CWRU) Dataset 该数据集拥有多种数据,测量的时候,通过改变轴承.

weixin_42036144的博客 2万+

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

题目链接题目大意:平面动态加点,求与给出的点曼哈顿距离最近点题解:KD树模板题我的收获:23333#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> using namespace std;#define cmin(a,b) (a>b?a=b:a) #define

蒟蒻的Bzoj记录 2204

破晓之光:GTK#框架让C# WinForm程序跨平台运行的终极指南

GTK#框架的出现,彻底打破了C# WinForm只能在Windows上运行的桎梏。

墨夶的博客 603

[bzoj2648]SJY摆棋子【kd-tree】

【题目描述】 2648: SJY摆棋子 Time Limit:20 SecMemory Limit:128 MBSubmit:5319Solved:1861 [Submit][Status][Discuss] Description 这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,...

dizhengyue1902的博客 257

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

【BZOJ2648】【kd_tree】SJY摆棋子

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

Gregory99174的博客 257

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

bzoj2648: SJY摆棋子(kd-tree)

传送门 kd−treekd-treekd−tree模板题。 题意简述:支持在平面上插入一个点,求对于一个点的最近点对。 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了kd−treekd-treekd−tree来做。 其实就是两个维度分别作为键值来建立二叉搜索树即可。 这道题在查询时可以通过判断下一层的有没有可能对答案有贡献来剪个枝。 由于蒟蒻暂时没写过方差划分因...

苟为蒟蒻又何妨 296

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[BZOJ2648]SJY摆棋子(KD-tree+讲解)

KD-tree第一弹!

薇小薇 534

[BZOJ2648] SJY摆棋子 kd-tree

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

weixin_30617561的博客 131

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

[bzoj2648][kd-tree]SJY摆棋子

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

Rose_max的博客 692

【BZOJ2648】SJY摆棋子 [KD-tree]

SJY摆棋子 Time Limit:20 SecMemory Limit:128 MB[Submit][Status][Discuss] Description   这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1...

weixin_34253126的博客 135

BZOJ 2648 SJY摆棋子(KD-Tree)

题目链接:BZOJ 2648 SJY摆棋子 题意: 在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距...

weixin_30655569的博客 223

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

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

weixin_30813225的博客 560

kd-tree 模板 Bzoj2648: SJY摆棋子

https://blog.aor.sd.cn/archives/445 #include<bits/stdc++.h> #define lc (ch[x][0]) #define rc (ch[x][1]) using namespace std; const int maxn=2e6+4; int n,m,cnt,ans; int mn[maxn][2]...

weixin_30483013的博客 174

bzoj 2648: SJY摆棋子(kd tree)

kd tree,裸的模板题。初学,看着别人模板敲了一遍,一直wa,但还找不到原因。。 学习资料: kd 树算法之思路篇:https://zhuanlan.zhihu.com/p/22557068 kd 树算法之详细篇:https://www.joinquant.com/post/2843 上边两篇和下边这篇还是有那么一点地方不同的。 K-D tree 数据结构:http://blog.cs

梦幻的蔷薇色 336

【bzoj2648】SJY摆棋子 KD-tree

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

weixin_30292745的博客 217
上一篇: [BZOJ]4570 [SCOI2016] 妖怪 凸包 + 双钩函数求最值
下一篇: [BZOJ]1069 [SCOI2007] 最大土地面积 凸包 + 旋转卡壳
MaxMercer
博客等级 码龄10年 55粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值