BZOJ4066 简单题(KD-Tree)
板子题。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<cassert> using namespace std; #define ll long long #define N 200010 #define inf 2000000000 #define lson tree[k].ch[0] #define rson tree[k].ch[1] char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;} int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int read() {int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f; } int n,m,root,cnt,c,ans,t,tot,id[N]; const double alpha=0.75; struct point {int d[2],v;bool operator <(const point&a) const{return d[c]<a.d[c];} }a[N]; struct KDTree{int ch[2],a[2][2],size,sum;point p; }tree[N]; inline bool isin(point p,int a[2][2]){return p.d[0]>=a[0][0]&&p.d[0]<=a[0][1]&&p.d[1]>=a[1][0]&&p.d[1]<=a[1][1];} inline bool isin(int a[2][2],int b[2][2]){return a[0][0]>=b[0][0]&&a[0][1]<=b[0][1]&&a[1][0]>=b[1][0]&&a[1][1]<=b[1][1];} inline bool iscross(int a[2][2],int b[2][2]){return max(a[0][0],b[0][0])<=min(a[0][1],b[0][1])&&max(a[1][0],b[1][0])<=min(a[1][1],b[1][1]);} void newnode(int k,point p) {tree[k].size=1,tree[k].sum=p.v,tree[k].p=p;tree[k].a[0][0]=tree[k].a[0][1]=p.d[0],tree[k].a[1][0]=tree[k].a[1][1]=p.d[1];lson=rson=0; } void get(int k) {if (lson) get(lson);t++,id[t]=k,a[t]=tree[k].p;if (rson) get(rson); } void build(int &k,int l,int r,int op) {if (l>r) return;c=op;int mid=l+r>>1;nth_element(a+l,a+mid,a+r+1);newnode(k=id[++tot],a[mid]);for (int i=l;i<=r;i++)tree[k].a[0][0]=min(tree[k].a[0][0],a[i].d[0]),tree[k].a[0][1]=max(tree[k].a[0][1],a[i].d[0]),tree[k].a[1][0]=min(tree[k].a[1][0],a[i].d[1]),tree[k].a[1][1]=max(tree[k].a[1][1],a[i].d[1]);build(lson,l,mid-1,op^1),build(rson,mid+1,r,op^1);tree[k].size+=tree[lson].size,tree[k].size+=tree[rson].size,tree[k].sum+=tree[lson].sum,tree[k].sum+=tree[rson].sum; } void rebuild(int &k,int op) {t=0;get(k);tot=0;build(k,1,t,op); } void ins(int &k,point p,int op) {if (!k) {newnode(k=++cnt,p);return;}if (max(tree[lson].size,tree[rson].size)>tree[k].size*alpha) rebuild(k,op);tree[k].size++;tree[k].sum+=p.v;tree[k].a[0][0]=min(tree[k].a[0][0],p.d[0]),tree[k].a[0][1]=max(tree[k].a[0][1],p.d[0]);tree[k].a[1][0]=min(tree[k].a[1][0],p.d[1]),tree[k].a[1][1]=max(tree[k].a[1][1],p.d[1]);if (tree[k].a[op][1]<=p.d[0]) ins(lson,p,op^1);else ins(rson,p,op^1); } int query(int k,int a[2][2]) {if (!k) return 0;if (isin(tree[k].a,a)) return tree[k].sum;return (isin(tree[k].p,a)?tree[k].p.v:0)+(iscross(tree[lson].a,a)?query(lson,a):0)+(iscross(tree[rson].a,a)?query(rson,a):0); } int main() { #ifndef ONLINE_JUDGEfreopen("bzoj4066.in","r",stdin);freopen("bzoj4066.out","w",stdout);const char LL[]="%I64d\n"; #elseconst char LL[]="%lld\n"; #endifread();int op=read();while (op<3){if (op==1){int x=read()^ans,y=read()^ans,z=read()^ans;ins(root,(point){{x,y},z},0);}else{int a[2][2];a[0][0]=read()^ans,a[1][0]=read()^ans,a[0][1]=read()^ans,a[1][1]=read()^ans;printf("%d\n",ans=query(root,a));}op=read();}return 0; }
转载于:https://www.cnblogs.com/Gloid/p/10161408.html
BZOJ4066 简单题(KD-Tree)相关推荐
- BZOJ4066:简单题(K-D Tree)
Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 将格 ...
- BZOJ4066: 简单题
BZOJ4066: 简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ...
- k-d tree算法的研究
By RaySaint 2011/10/12 动机 先前写了一篇文章<SIFT算法研究>讲了讲SIFT特征具体是如何检测和描述的,其中也提到了SIFT常见的一个用途就是物体识别,物体识别的 ...
- BZOJ 3489: A simple rmq problem(K-D Tree)
Time Limit: 40 Sec Memory Limit: 512 MB Submit: 2579 Solved: 888 [Submit][Status][Discuss] Descrip ...
- BZOJ1941:[SDOI2010]Hide and Seek(K-D Tree)
Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏- ...
- K-D Tree学习笔记
引入 K-D Tree 是一种处理高维空间的数据结构. 支持O(nk−1k)O(n^{\frac {k-1}k})O(nkk−1)查询给定超矩形内的点的信息, kkk 为维数. 可以用替罪羊树的思想 ...
- [学习笔记] 乱世之神杀疯了 —— K-D tree
文章目录 K-D tree 建树 合并 插入 删除 查询(估价函数) 旋转坐标系 题目练习 [SDOI2012]最近最远点对 [Violet]天使玩偶/SJY摆棋子 [CQOI2016]K远点对 [国 ...
- HDU2966 In case of failure(浅谈k-d tree)
嘟嘟嘟 题意:给定\(n\)个二维平面上的点\((x_i, y_i)\),求离每一个点最近的点得距离的平方.(\(n \leqslant 1e5\)) 这就是k-d tree入门题了. k-d tre ...
- PCL :K-d tree 2 结构理解
K-d tree 基础思路:(先看之前的KNN思想,更容易理解) 导语:kd 树是一种二叉树数据结构,可以用来进行高效的 kNN 计算.kd 树算法偏于复杂,本篇将先介绍以二叉树的形式来记录和索引空间 ...
- PCL:k-d tree 1 讲解
1.简介 kd-tree简称k维树,是一种空间划分的数据结构.常被用于高维空间中的搜索,比如范围搜索和最近邻搜索.kd-tree是二进制空间划分树的一种特殊情况.(在激光雷达SLAM中,一般使用的是三 ...
最新文章
- COGNOS8培训之四(疑点解析)
- 源代码安装-非ROOT用户安装软件的方法
- 一文弄懂YOLO目标检测算法
- 前端构建工具gulpjs的使用介绍及技巧 (转)
- IDEA项目搭建七——使用Feign简化消费者端操作
- 不同服务器之间进行传输
- ios 各种锁的使用性能比较
- 数据:昨日BTC和ETH期货持仓均减少约三成,波动率创3月以来新高
- 1w存银行一年多少利息_一百万存银行一年利息多少?提前取出利息怎么算?
- 趣图:程序员的 5 个职业生涯阶段,你处于在哪个阶段呢
- 用户需求分析:背后隐藏的门槛
- LOL易游网络验证破解总结
- Swiper、vue-awesome-swiper中文文档
- 大数据开源框架环境配置(一)——安装VMware
- 十大著名黑客—— 凯文-米特尼克
- openwrt官方固件怎么中继网络
- addition过程 sgnb_5G-NSA接入流程分析及问题定位四步法
- 用完加速器国内的网址打不开了?
- 【英语学习工具】解说 LeHoCat 提供免费的 视频集制作工具 使用方法, 看视频学英语的制作工具, 制作英语教学课件的工具, 帮助自学英语(详细图文解说)
- 使用联想智能引擎的电脑,将会懂你的心思
热门文章
- java项目中的pom依赖在哪_java – 如何包含pom项目中的所有模块
- php mysql pod_php – 连接到同一pod中的MySQL容器
- 以太坊 交易 data字段 内容是什么
- java并发编程(1)--线程 可见性 volatile怎么用
- kubernetes视频教程笔记 (6)-kubernetes集群安装
- 基于Java的外卖订餐平台
- java memcached delete_Memcached删除/Delete数据
- 九、Linux 软件包安装
- java maven本地库导入本地包
- Nginx/Apache 对图片,css,js等优化,静态页面设置过期时间