题意

有一个长方体,不知道它的位置,给出 \(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]的更多相关文章

  1. 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 ...

  2. k-d tree 学习笔记

    以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...

  3. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  4. K-D Tree

    这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...

  5. K-D Tree题目泛做(CXJ第二轮)

    题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...

  6. k-d Tree in TripAdvisor

    Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...

  7. k-d tree算法

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...

  8. k-d tree模板练习

    1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...

  9. [模板] K-D Tree

    K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...

  10. BZOJ3489 A simple rmq problem K-D Tree

    传送门 什么可持久化树套树才不会写呢,K-D Tree大法吼啊 对于第\(i\)个数,设其前面最后的与它值相同的位置为\(pre_i\),其后面最前的与它值相同的位置为\(aft_i\),那么对于一个 ...

随机推荐

  1. sql server 用户'sa'登录失败(错误18456)

    转载于:http://thenear.blog.51cto.com/4686262/865544 用户'sa'登录失败(错误18456)解决方案图解     当我们在使用sql server 的时候可 ...

  2. Sql Server与.Net(C#)中星期值对比

    最近发现Sql Server与.Net(C#)中星期值居然不匹配,倒不知道依哪一个了. 1.Sql Server declare @date datetime; set @date = '2017-0 ...

  3. MySQL-死锁查询

    1.查询是否锁表 show OPEN TABLES where In_use > 0; 查询到相对应的进程 === 然后 kill    id 2.查询进程 show processlist 补 ...

  4. cat > file << EOF 与 cat > file << -

    当我们在使用kickstart 的时候,会遇到写网卡配置文件的情况,这时候我们使用cat > file << EOF 命令等,可以从标准输入中接受输入并保存到 file 文件中. c ...

  5. selenium-键盘和鼠标事件

    常见的键盘操作 from selenium.webdriver.common.keys import Keys 模拟enter键:send_keys(Keys.ENTER)键盘F1~F12: send ...

  6. linux安装mydumper软件包以及报错解决

    今天使用mydumper命令从AWS上的RDS集群MYSQL数据库导出数据,发现Tidb官方提供的工具不太适合,所以就自己编译了一个来尝试一下,居然成功了. 首先我的系统是Centos7,并且已经安装 ...

  7. idea本地将本地现有的项目和gitlab进行管理并提交到线上

    备注:通过这个操作可以让本地的项目与远程gitlab进行关联,并将本地的代码提交到gitlab上面 1.在idea的菜单项选择 VCS>Import into Version Control&g ...

  8. 团队作业——Alpha冲刺 5/12

    团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:编辑界面完成部分内容,学习了下拉菜单控件的建立,完善界面标题内容,以及交互. 明日任务:继续完善编辑界面,学习使用gallery,着手配图 ...

  9. [python]关于在python中模块导入问题追加总结

    [背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...

  10. 原生JS简单的无缝自动轮播

    最近在不断的加强巩固js.在学习jq和vue之后发现很多东西其实都是不明所以,有些底层的东西自己不懂,到头来也只是一昧的使用,一直在用别人的东西,对自己的成长帮助也不大. 万丈高楼平地起,基础打扎实了 ...