[CF1010E]Store[kd-tree]
题意
有一个长方体,不知道它的位置,给出 \(n\) 个一定在长方体内的点和 \(m\) 个一定不在的点,有 \(k\) 次询问,每次询问一个点是否 在、不在、不确定 在长方体内。
\(n\leq 10^5\)
分析
一道模板题。
发现实际的可行区域并不是一个规则图形,貌似不好维护。
我们考虑每次询问一个点,容易求出满足要求的最小的矩形。此时就变成了一个三维数点问题,离线 \(cdq\) 分治或者 \(kd-tree\) 都可以。
总时间复杂度为 \(O(n\sqrt n)\)。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pb push_back
inline int gi() {
int x = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << 3) + (x << 1) + ch - 48;
ch = getchar();
}
return x * f;
}
template <typename T> inline void Max(T &a, T b){if(a < b) a = b;}
template <typename T> inline void Min(T &a, T b){if(a > b) a = b;}
const int N = 1e5 + 7, inf = 0x3f3f3f3f;
int d[3], lim[3][2];
int n, m, k, D, rt;
#define Ls t[o].ch[0]
#define Rs t[o].ch[1]
struct node {
int ch[2], d[3], l[3], r[3], s;
node(){memset(l, 0x3f, sizeof l);}
bool operator <(const node &rhs) const {
return d[D] < rhs.d[D];
}
}t[N], A, tmp;
void mt(int o, int s) {
rep(i, 0, 2) Min(t[o].l[i], t[s].l[i]), Max(t[o].r[i], t[s].r[i]);
t[o].s += t[s].s;
}
void build(int d, int l, int r, int &o) {
if(l > r) return;
D = d; o = l + r >> 1;
nth_element(t + l, t + o, t + r + 1);
rep(i, 0, 2) t[o].l[i] = t[o].r[i] = t[o].d[i];
if(l < o) build((d + 1) % 3, l, o - 1, Ls), mt(o, Ls);
if(r > o) build((d + 1) % 3, o + 1, r, Rs), mt(o, Rs);
}
bool all(int o) {
rep(i, 0, 2) {
if(!(lim[i][0] <= t[o].l[i] && t[o].r[i] <= lim[i][1])) return 0;
}
return 1;
}
bool empty(int o) {
rep(i, 0, 2) if(t[o].r[i] < lim[i][0] || lim[i][1] < t[o].l[i]) return 1;
return 0;
}
bool in(int o) {
rep(i, 0, 2) {
if(!(lim[i][0] <= t[o].d[i] && t[o].d[i] <= lim[i][1])) return 0;
}
return 1;
}
int query(int d, int o) {
if(!o) return 0;
int s = in(o);
if(all(o)) return t[o].s;
if(empty(o)) return 0;
return query((d + 1) % 3, Ls) + s + query((d + 1) % 3, Rs);
}
int main() {
rep(i, 0, 2) scanf("%*d");
n = gi(), m = gi(), k = gi();
rep(i, 1, n) {
rep(j, 0, 2) d[j] = gi(), Min(A.l[j], d[j]), Max(A.r[j], d[j]);
}
rep(i, 1, m) {
rep(j, 0, 2) t[i].d[j] = gi();
t[i].s = 1;
bool fg = 1;
rep(j, 0, 2) fg &= A.l[j] <= t[i].d[j] && t[i].d[j] <= A.r[j];
if(fg) return puts("INCORRECT"), 0;
}
build(0, 1, m, rt);
puts("CORRECT");
rep(i, 1, k) {
bool fg = 1;
rep(j, 0, 2) {
d[j] = gi();
lim[j][0] = min(d[j], A.l[j]);
lim[j][1] = max(d[j], A.r[j]);
fg &= A.l[j] <= d[j] && d[j] <= A.r[j];
}
if(fg) { puts("OPEN"); continue;}
if(query(0, rt)) puts("CLOSED");
else puts("UNKNOWN");
}
return 0;
}
[CF1010E]Store[kd-tree]的更多相关文章
- AOJ DSL_2_C Range Search (kD Tree)
Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- K-D Tree
这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...
- K-D Tree题目泛做(CXJ第二轮)
题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...
- k-d Tree in TripAdvisor
Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...
- k-d tree算法
k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...
- k-d tree模板练习
1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...
- [模板] K-D Tree
K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...
- BZOJ3489 A simple rmq problem K-D Tree
传送门 什么可持久化树套树才不会写呢,K-D Tree大法吼啊 对于第\(i\)个数,设其前面最后的与它值相同的位置为\(pre_i\),其后面最前的与它值相同的位置为\(aft_i\),那么对于一个 ...
随机推荐
- 想涨工资吗?那就学习Scala,Golang或Python吧
[编者按]据薪水调查机构 PayScale 提供的数据显示,掌握 Scala,Golang 和 Python 语言以及诸如 Apache Spark 之类的大数据技术,能带来最大的薪水提升.本文作者为 ...
- LeetCode题解之 Search in a Binary Search Tree
1.题目描述 2.问题分析 利用递归遍历二叉查找树. 3.代码 TreeNode* searchBST(TreeNode* root, int val) { if (root == NULL) ret ...
- Hibernate 批处理
批处理 考虑一种情况,你需要使用 Hibernate 将大量的数据上传到你的数据库中.以下是使用 Hibernate 来达到这个的代码片段: Session session = SessionFact ...
- CSS| 颜色名
CSS 颜色名 所有浏览器都支持的颜色名. HTML 和 CSS 颜色规范中定义了 147 中颜色名(17 种标准颜色加 130 种其他颜色).下面的表格中列出了所有这些颜色,以及它们的十六进制值. ...
- MySQL查询计划 key_len计算方法
本文首先介绍了MySQL的查询计划中ken_len的含义:然后介绍了key_len的计算方法:最后通过一个伪造的例子,来说明如何通过key_len来查看联合索引有多少列被使用. key_len的含义 ...
- 李嘉诚 《Are you ready》
当你们梦想着为伟大成功的时候,你有没有刻苦的准备? 当你们有野心作领袖的时候,你有没有服务于人的谦恭? 我们常常都想有所获得,但我们有没有付出的情操? 我们都希望别人听到自己的话,我们有没有耐性聆听别 ...
- dll动态链接库导出函数方法 -- 静态导出(__declspec前缀导出)
简介 在之前已经笔者已经写过利用.def文件进行dll函数动态导出的文章,那么今天就给大家介绍一下,如何利用**__declspec**函数前缀进行简单的静态函数导出. 要点 大家阅读过动态导出的文章 ...
- MySQL主从延迟如何解决?
我们知道生产环境中经常会遇到MySQL主从延迟问题,从原理上也能看出主库的事务提交是并发模式,而从库只有一个SQL线程负责解析,所以本身上就可能存在延迟. 延迟的主要原因在于: 1.从库的配置往往没有 ...
- 移动web前端开发时注意事项
在智能手机横行的时代,作为一个web前端,不会编写移动web界面,的确是件悲催的事情.当公司准备做一个微信的微网站时,作为一个多年经验的web前端码农,我迷茫了,真心不知道从何下手. 接下来就是搜一堆 ...
- ubuntu 视频播放问题
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/chang_xing/article/details/30976659 ...