KDTree模板,双倍经验啦啦啦~

#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x=getint()
using namespace std;
const int N = 500003;
const int inf = 0x7fffffff;
int getint() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - '0';
return k * fh;
}
bool D;
int n, t, root, ans;
struct KDT {
int d[2], ch[2], minn[2], maxn[2];
bool operator < (const KDT &a) const {return d[D] < a.d[D];}
void init() {for(int i = 0; i < 2; ++i) minn[i] = maxn[i] = d[i];}
} T[N << 1], QQ;
void pushup(int rt) {
for(int i = 0; i < 2; ++i)
if (T[rt].ch[i]) {
int x = T[rt].ch[i];
for(int j = 0; j < 2; ++j)
T[rt].minn[j] = min(T[rt].minn[j], T[x].minn[j]),
T[rt].maxn[j] = max(T[rt].maxn[j], T[x].maxn[j]);
}
}
int Build(int l = 1, int r = n, bool d = 0) {
D = d; int mid = (l + r) >> 1; nth_element(T + l, T + mid, T + r + 1);
T[mid].init();
if (l != mid) T[mid].ch[0] = Build(l, mid - 1, !d);
if (r != mid) T[mid].ch[1] = Build(mid + 1, r, !d);
pushup(mid);
return mid;
}
int ask(int rt, KDT p) {
int ret = 0;
for(int i = 0; i < 2; ++i)
ret += max(0, T[rt].minn[i] - p.d[i]), ret += max(0, p.d[i] - T[rt].maxn[i]);
return ret;
}
void insert(int rt = root, bool d = 0) {
bool flag = T[n].d[d] > T[rt].d[d];
if (T[rt].ch[flag]) insert(T[rt].ch[flag], !d);
else T[rt].ch[flag] = n;
pushup(rt);
}
int dis(KDT a, KDT b) {
return abs(a.d[0] - b.d[0]) + abs(a.d[1] - b.d[1]);
}
void Query(int rt = root, bool d = 0) {
int Dis = dis(T[rt], QQ), dl = inf, dr = inf;
ans = min(ans, Dis);
if (T[rt].ch[0]) dl = ask(T[rt].ch[0], QQ);
if (T[rt].ch[1]) dr = ask(T[rt].ch[1], QQ);
if (dl < dr) {
if (dl < ans) Query(T[rt].ch[0], !d);
if (dr < ans) Query(T[rt].ch[1], !d);
} else {
if (dr < ans) Query(T[rt].ch[1], !d);
if (dl < ans) Query(T[rt].ch[0], !d);
}
}
int main() {
read(n); read(t);
for(int i = 1; i <= n; ++i)
read(T[i].d[0]), read(T[i].d[1]);
int num;
for(root = Build(); t; --t) {
read(num); ans = inf;
if (num == 1) {
read(T[++n].d[0]); read(T[n].d[1]);
T[n].init();
insert();
} else {
read(QQ.d[0]); read(QQ.d[1]);
Query();
printf("%d\n", ans);
}
}
return 0;
}

现在学新东西感觉就是作死啊~

最新文章

  1. 使用ENode框架前您需要了解的东西(初稿)
  2. Django--models多对多
  3. Metro-UI系统-1-tile标签
  4. Linux tcp_wrappers 详解
  5. 学习RFS,所有文章的参考
  6. 【css技能提升】css高级技巧
  7. POJ 1659 Frogs&#39; Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】
  8. Python3实现ICMP远控后门(上)_补充篇
  9. 【作业4.0】HansBug的第四次面向对象课程思考
  10. c# 序列化效率比拼
  11. gcc使用及动静态库制作
  12. 《R语言入门与实践》第二章:R包和帮助文档
  13. (一)java异常处理的几个问题
  14. mysql 多表删除
  15. 10 种机器学习算法的要点(附 Python 和 R 代码)
  16. python 类组合
  17. ngnix笔记
  18. java实时监控mysql数据库变化
  19. java文件读写工具类
  20. Linux的发行版之间的联系和区别

热门文章

  1. Caffe源码解析1:Blob
  2. hdu1247 Hat’s Words
  3. CSS样式----图文详解:css样式表和选择器
  4. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
  5. java 22 - 19 多线程之生产者和消费者的代码优化
  6. noip模拟赛(10.4) 字典序(dictionary)
  7. iOS多线程之GCD详解
  8. IIS Enabling HTTP Keep-Alives
  9. nginx限制上传大小和超时时间设置说明/php限制上传大小
  10. Centos5.8 安装SVN并配置HTTP访问