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,顾名思义,这是一种处理多维空间的数据结构. 例如 ...
随机推荐
- Deep Photo的TensorFlow版本
Prisma这个应用,你可能很熟悉.这是一个能将不同的绘画风格,迁移到照片中,形成不同艺术风格的图片. 2017年4月,美国康奈尔大学和Adobe的一个研究团队在arvix上通过论文“Deep Pho ...
- mfc CSpinButton
知识点: CSliderCtrl(滑块)控件 CSliderCtrl常用属性 CSliderCtrl类常用成员函数 CSliderCtrl运用示例 一.CSliderCtr常用属性 Orientati ...
- WinDbg命令三部曲
WinDbg 命令三部曲:(一)WinDbg 命令手册 WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册 WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册
- MySQL主从报错1594
一.主从报错 Relay log read failure 问题原因,MySQL主从使用的是kvm虚拟机,物理机超分严重,在负载高的情况下会kill掉占用资源最多的虚拟机,再启动后导致主从失败 mys ...
- CS50.1
1,GUI,graphical user interface,图形用户界面 2.VB,visual basic,微软开发的一种程序语言 3,BIT,binary digit 比特 4,byte 5,8 ...
- 设计模式 笔记 适配器模式 Adapter
//---------------------------15/04/13---------------------------- //Adapter 适配器模式 ----类对象结构型模式 /* 1: ...
- 基于Vue手写一个下拉刷新
当然不乏有很多下拉刷新的插件可以直接使用,但是自定义程度不强,大部分都只能改改文字,很难满足设计师的创意,譬如淘宝和京东首页那种效果,就需要自己花心思倒腾了,最近刚好有这种需求,做完了稍微总结一下,具 ...
- 取两张mysql表中分别两个字段相同的值
看起来有点绕口吧,举个例子吧,如图 两张表,字段名也不同字段gs 和另一张表 gsmc 的有些值是相同的 我们要做的就是把这个相同的值找出来 会写这个sql语句就可以 只写重点 $sql2 = &q ...
- 矩阵分解----Cholesky分解
矩阵分解是将矩阵拆解成多个矩阵的乘积,常见的分解方法有 三角分解法.QR分解法.奇异值分解法.三角分解法是将原方阵分解成一个上三角矩阵和一个下三角矩阵,这种分解方法叫做LU分解法.进一步,如果待分解的 ...
- Sprint 1 Review & Daily Scrum - 11/18
今天我们组利用课后的时间对Sprint 1阶段进行了回顾,并对接下来的工作进行了安排. Sprint 1阶段我们开始定的计划是完成最基础的背单词功能,可以让用户可以完整地走一遍背单词流程.回顾上周,我 ...