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<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),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[],v;
bool operator <(const point&a) const
{
return d[c]<a.d[c];
}
}a[N];
struct KDTree{int ch[],a[][],size,sum;point p;
}tree[N];
inline bool isin(point p,int a[][]){return p.d[]>=a[][]&&p.d[]<=a[][]&&p.d[]>=a[][]&&p.d[]<=a[][];}
inline bool isin(int a[][],int b[][]){return a[][]>=b[][]&&a[][]<=b[][]&&a[][]>=b[][]&&a[][]<=b[][];}
inline bool iscross(int a[][],int b[][]){return max(a[][],b[][])<=min(a[][],b[][])&&max(a[][],b[][])<=min(a[][],b[][]);}
void newnode(int k,point p)
{
tree[k].size=,tree[k].sum=p.v,tree[k].p=p;
tree[k].a[][]=tree[k].a[][]=p.d[],tree[k].a[][]=tree[k].a[][]=p.d[];
lson=rson=;
}
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>>;
nth_element(a+l,a+mid,a+r+);
newnode(k=id[++tot],a[mid]);
for (int i=l;i<=r;i++)
tree[k].a[][]=min(tree[k].a[][],a[i].d[]),tree[k].a[][]=max(tree[k].a[][],a[i].d[]),
tree[k].a[][]=min(tree[k].a[][],a[i].d[]),tree[k].a[][]=max(tree[k].a[][],a[i].d[]);
build(lson,l,mid-,op^),build(rson,mid+,r,op^);
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=;get(k);
tot=;build(k,,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[][]=min(tree[k].a[][],p.d[]),tree[k].a[][]=max(tree[k].a[][],p.d[]);
tree[k].a[][]=min(tree[k].a[][],p.d[]),tree[k].a[][]=max(tree[k].a[][],p.d[]);
if (tree[k].a[op][]<=p.d[]) ins(lson,p,op^);
else ins(rson,p,op^);
}
int query(int k,int a[][])
{
if (!k) return ;
if (isin(tree[k].a,a)) return tree[k].sum;
return (isin(tree[k].p,a)?tree[k].p.v:)+
(iscross(tree[lson].a,a)?query(lson,a):)+
(iscross(tree[rson].a,a)?query(rson,a):);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4066.in","r",stdin);
freopen("bzoj4066.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
read();int op=read();
while (op<)
{
if (op==)
{
int x=read()^ans,y=read()^ans,z=read()^ans;
ins(root,(point){{x,y},z},);
}
else
{
int a[][];a[][]=read()^ans,a[][]=read()^ans,a[][]=read()^ans,a[][]=read()^ans;
printf("%d\n",ans=query(root,a));
}
op=read();
}
return ;
}
BZOJ4066 简单题(KD-Tree)的更多相关文章
- BZOJ4066:简单题(K-D Tree)
Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ...
- P4148 简单题 k-d tree
思路:\(k-d\ tree\) 提交:2次 错因:整棵树重构时的严重错误:没有维护父子关系(之前写的是假重构所以没有维护父子关系) 题解: 遇到一个新的点就插进去,如果之前出现过就把权值加上. 代码 ...
- [BZOJ2683][BZOJ4066]简单题
[BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...
- bzoj4066: 简单题 K-Dtree
bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...
- Bzoj4066 简单题
Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 2185 Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...
- bzoj 4066: 简单题 K-D树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...
- 【kd-tree】bzoj4066 简单题
同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ...
- bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...
- 初涉k-d tree
听说k-d tree是一个骗分的好东西?(但是复杂度差评??? 还听说绍一的kdt常数特别小? KDT是什么 KDT的全称是k-degree tree,顾名思义,这是一种处理多维空间的数据结构. 例如 ...
随机推荐
- css样式显示省略号
用css样式显示省略号,记 .xx{ display: block; width:200px;/*对宽度的定义,根据情况修改*/ overflow: hidden; white-space: n ...
- HUE的安装
HUE: Hadoop User Experience 官网地址:http://gethue.com/ Hue官网无法下载,超时. 使用CDH版本安装. 下载地址: http://archive.cl ...
- 笔记:UITextView内容垂直居中方法
- (void)contentSizeToFit { //先判断一下有没有文字(没文字就没必要设置居中了) ) { //textView的contentSize属性 CGSize contentSiz ...
- Python3入门(十一)——IO编程
一.文件读写 python的文件操作和C是兼容的 1.读文本文件 读文件操作如下: f = open("F:/1.txt", "r") data = f.rea ...
- 20155223 Exp9 Web安全基础实践
20155223 Exp9 Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 攻击原理:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定 ...
- [Oracle][Corruption]究竟哪些检查影响到 V$DATABASE_BLOCK_CORRUPTION
根据 471716.1,11g 之后,下列动作如果遇到坏块,都会输出记录到 V$DATABASE_BLOCK_CORRUPTION. - Analyze table .. Validate str ...
- PHP7添加opcache.so模块
启动php报错如下: # /usr/local/php7/sbin/php-fpm [-Apr- ::] NOTICE: PHP message: PHP Warning: PHP Startup: ...
- 设计模式 笔记 组合模式 Composite
//---------------------------15/04/16---------------------------- //Composite 组合模式----对象结构型模式 /* 1:意 ...
- javascript source map 的使用
之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大意 ...
- OpenGL学习(2)——绘制三角形(补)
对上一篇的补充,通过绘制三角形来完成矩形的绘制.此外,完成章节后练习. 绘制矩形 一个矩形由两个三角形组成,因此绘制矩形需要绘制两个三角形,一共6个顶点,其中2个顶点重复画了两次. 为了减小开销,仅储 ...